Рассмотрим следующее:
struct A {
typedef int foo;
};
struct B {};
template<class T, bool has_foo = /* ??? */>
struct C {};
Я хочу специализировать C так, чтобы C получил одну специализацию, а C — другую, на основе наличие или отсутствие имени типа T ::foo. Возможно ли это с помощью признаков типа или какой-либо другой магии шаблонов?
Проблема в том, что все, что я пробовал, приводит к ошибке компиляции при создании экземпляра C, потому что B ::foo не существует. Но это то, что я хочу проверить!
Редактировать :Я думаю, что ответ ildjarn лучше, но я наконец придумал следующее решение C++ 11. Чувак, это халтурно, но, по крайней мере, коротко.:)
template<class T>
constexpr typename T::foo* has_foo(T*) {
return (typename T::foo*) 1;
}
constexpr bool has_foo(...) {
return false;
}
template<class T, bool has_foo = (bool) has_foo((T*)0)>