2016-12-16 1 views
3

Если у меня есть шаблон функцииЧтобы проверить, если класс может быть типаж другому

template<class T, class U> 
T foo (U a); 

Как я могу проверить, если объект класса U может быть приведение типа в объект T

То есть Если класс U имеет функцию-член

operator T(); // Whatever T maybe 

или класс T имеет конструктор

T(U& a); //ie constructs object with the help of the variable of type U 

ответ

7

Вы можете использовать std::is_convertible (с C++ 11):

template<class T, class U> 
T foo (U a) { 
    if (std::is_convertible_v<U, T>) { /*...*/ } 
    // ... 
} 

Обратите внимание, что is_convertible_v добавляется, так как C++ 17, если ваш компилятор еще не поддерживает это, вы могли бы использовать std::is_convertible<U, T>::value вместо.

+0

будет проверять как для конструктора, так и для оператора типа? – WARhead

+0

Будет ли он работать на C++ 11? – WARhead

+1

@WARhead Да, он будет проверять оба. Если любой из них существует, он вернет «истину». Для C++ 11 используйте 'std :: is_convertible :: value'. – songyuanyao