2015-11-09 12 views
0

Можно ли во время компиляции проверить, имеют ли две конструкторы, принадлежащие двум различным классам, одну и ту же подпись? И если это возможно, как его реализовать?Конструкторы проверки времени компиляции с одинаковой сигнатурой

Пример:

struct A 
{ 
    A(int){} 
}; 

struct B 
{ 
    B(int){} 
}; 

int main() 
{ 
    static_assert(std::same_signature< A::A , B::B >::value, "A and B must have the same constructor parameters"); 

    return 0; 
} 
+0

Пожалуйста, приведите некоторые примеры кода. Как бы вы использовали такую ​​черту? – TartanLlama

+1

Пробуем что-то с помощью '' decltype' '(http://en.cppreference.com/w/cpp/language/decltype) вместе с [функциями поддержки типа] (http://en.cppreference.com/w/cpp/типы). –

+0

Как вы хотите обрабатывать аргументы по умолчанию? –

ответ

1

Можно ли проверить, во время компиляции, если два конструктора, принадлежащих к двум различным классам имеют одинаковую сигнатуру?

Не совсем то, что вы хотите, но вы можете проверить, если 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"; 
} 
+0

Отличный код, это может частично решить проблему, если я просто смогу извлечь параметры некоторым вариационным способом, например, «Args ...» или аналогичным – nyarlathotep108