Можно ли проверить, во время компиляции, если два конструктора, принадлежащих к двум различным классам имеют одинаковую сигнатуру?
Не совсем то, что вы хотите, но вы можете проверить, если class A
и class B
могут быть построены из одних и тех же типов, используя такую конструкцию CheckConstructable<A, B, types...>::value
, C++ 11:
#include <utility>
#include <string>
#include <type_traits>
#include <iostream>
struct A { A(int){} };
struct B { B(int){} B(std::string) {} };
struct C { C(std::string) {} };
template<class A, class B, typename... Types>
struct CheckConstructable;
template<class A, class B>
struct CheckConstructable<A, B> {
static constexpr bool value = false;
};
template<class A, class B, typename T1, typename... Types>
struct CheckConstructable<A, B, T1, Types...> {
static constexpr bool cur_type_ok = std::is_constructible<A, T1>::value && std::is_constructible<B, T1>::value;
static constexpr bool value = cur_type_ok || CheckConstructable<A, B, Types...>::value;
};
int main()
{
std::cout << "Have the same: " << (CheckConstructable<A, B, int, std::string>::value ? "yes" : "no") << "\n";
std::cout << "Have the same: " << (CheckConstructable<A, B, std::string>::value ? "yes" : "no") << "\n";
std::cout << "Have the same: " << (CheckConstructable<A, C, std::string>::value ? "yes" : "no") << "\n";
std::cout << "Have the same: " << (CheckConstructable<B, C, std::string, int>::value ? "yes" : "no") << "\n";
}
Пожалуйста, приведите некоторые примеры кода. Как бы вы использовали такую черту? – TartanLlama
Пробуем что-то с помощью '' decltype' '(http://en.cppreference.com/w/cpp/language/decltype) вместе с [функциями поддержки типа] (http://en.cppreference.com/w/cpp/типы). –
Как вы хотите обрабатывать аргументы по умолчанию? –