如何检查嵌套模板的类型?

时间:2015-01-20 00:07:57

标签: c++ templates sfinae

我想创建一个类型特征,用于检测其他感兴趣类型中是否存在嵌套类模板。

例如,假设我想创建类型特征has_foo,它会检测某个类型foo中名为T的一个参数的嵌套模板的存在:

#include <cassert>

template<class T>
struct has_foo
{
  // XXX what goes here?
};

struct with_foo
{
  template<class T> struct foo {};
};

struct without_foo {};

int main()
{
  assert(has_foo<with_foo>::value);
  assert(!has_foo<without_foo>::value);

  return 0;
}

实施has_foo的最佳方式是什么?

1 个答案:

答案 0 :(得分:6)

template <template<class> class> using void_templ = void;

template <typename, typename=void> struct has_foo : std::false_type {};

template <typename T>
struct has_foo<T, void_templ<T::template foo>>  : std::true_type {};

Demo。海湾合作委员会将允许任何类型;那是一个错误。要解决这个问题,请void_templ使用类模板

template <template<class> class>
struct void_templ {using type = void;};

Demo