测试template参数是否定义了特定的类型名称

时间:2011-03-14 21:04:54

标签: c++ c++11

假设我有一个这样的模板类:

template<typename T>
class Foo {};

这样的课程如下:

class PossibleArg
{ typedef int required_type; }

是否可以在类Foo中编写static_assert来检查是否定义了T :: required_type?

4 个答案:

答案 0 :(得分:3)

也许看起来像:

template <typename T>
class Foo {
  static_assert(sizeof(T::required_type) > 0, "Never shows up");
};

编辑:其他方式:SFINAE

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

  template <typename C>
  static yes& test(typename C::required_type*);

  template <typename>
  static no& test(...);

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

template <typename T>
class Foo {
  static_assert(has_required_type<T>::value, "Hasn't required type");
};

答案 1 :(得分:2)

您可以在Boost.MPL中使用BOOST_MPL_HAS_XXX_TRAIT_DEF

BOOST_MPL_HAS_XXX_TRAIT_DEF( required_type )

BOOST_MPL_ASSERT(( has_required_type< PossibleArg > ));

BOOST_MPL_HAS_XXX_TRAIT_DEF是一个宏,以名称xxx作为参数,生成元函数has_xxx< T >,如果T定义名为xxx的嵌套类型,则计算结果为true。

(注意,MPL元函数是一个编译时函数,其结果可以使用::type访问。在这种情况下的结果是编译时布尔常量(即bool_。)< / p>

答案 2 :(得分:2)

如果您的目标是在T没有required_type时遇到编译器错误,您只需在Foo中键入def。或者我错过了什么?

template<typename T>
class Foo {
  typedef typename T::required_type T_required_type;
};

答案 3 :(得分:0)

如果您实际上在寻找static_assert,那么这里有类似的内容 - Static assert without boost or C++0x