Это возможно, и есть много способов реализовать это. Все они должны вернуться к некоторому классу признаков has_type
, чтобы has_type<T>::value
было истинным, если существует член typedef, и ложным в противном случае. Давайте предположим, что у нас уже есть этот класс черт. Тогда вот одно решение, использующее псевдонимы шаблона C ++ 11:
template <typename T, bool> class FooImpl
{
// implement general case
};
template <typename T> class FooImpl<T, true>
{
// implement specific case
};
template <typename T> using Foo = FooImpl<T, has_type<T>::value>; // C++11 only
Теперь, чтобы сделать набег:
template<typename T>
struct has_type
{
private:
typedef char yes;
typedef struct { char array[2]; } no;
template<typename C> static yes test(typename C::context_type*);
template<typename C> static no test(...);
public:
static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
Если у вас нет C ++ 11 или если вы не хотите переписывать весь класс, вы можете сделать это различие более детальным, например, с помощью std::enable_if
, std::conditional
и т. д. Оставьте комментарий, если вам нужны конкретные примеры.