如何确定一个类是否包含子类/类型?

时间:2011-07-01 15:38:35

标签: c++ templates sfinae

如果类具有某些子类/类型,我们可以知道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。我有tried this code,但不起作用。

1 个答案:

答案 0 :(得分:0)

以下是我在问题中发布的维基百科链接中的答案!! (感谢@n.m。)

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);
};

这是the demo