假设我有一个这样的模板类:
template<typename T>
class Foo {};
这样的课程如下:
class PossibleArg
{ typedef int required_type; }
是否可以在类Foo中编写static_assert来检查是否定义了T :: required_type?
答案 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