Как определить, содержит ли класс подкласс / тип? - PullRequest
3 голосов
/ 01 июля 2011

Можем ли мы иметь трюк SFINAE , чтобы узнать, имеет ли класс определенный подкласс / тип.Примерно так:

template<typename TYPE> // searches for "my_type"
struct has_inner_type {
  enum { value = <???> };
};

Ниже приведены примеры:

struct A {
  class my_type {};  // has_inner_type::value = true 
};
struct B { }; // has_inner_type::value = false
struct C { typedef int my_type; }; // has_inner_type::value = true

Я испробовал несколько хитростей, но в основном потерпел неудачу с ожидаемыми ошибками компилятора.Использование:

bool b = has_inner_type<A>::value;  // with respect to "my_type"

Редактировать : я заново отредактировал свой вопрос, поскольку кажется, что невозможно передать my_type в качестве второго параметра в has_inner_type.Итак, на данный момент вопрос состоит в том, чтобы найти только определенный тип как my_type попробовал этот код , который не работает.

1 Ответ

0 голосов
/ 02 июля 2011

Ниже приведен ответ, который присутствовал в ссылке на википедию, которую я разместил в вопросе !!(спасибо @ nm .)

template <typename T> 
struct has_inner_type
{
  typedef char yes[1];
  typedef char no[2];

  template <typename C> static yes& test(typename C::my_type*);
  template <typename> static no& test(...);

  static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};

Вот демо .

...