如果变量是c ++中的类,结构或基本类型,有没有办法编译时断言?
-
06-07-2019 - |
题
我正在尝试实现一个模板类,它可以告诉我变量是类,结构还是基本类型。
到目前为止,我已经来了:
template< typename T >
class is_class
{
private:
template< typename X >
static char ( &i_class( void(X::*)() ) )[1];
//
template< typename X >
static char ( &i_class( X ) )[2];
public:
static bool const val = sizeof( i_class< T >(0) ) == 1;
};
和ussage:
is_class< int >::val; // false
is_class< some_class_type >::val; // true
问题是现在我需要在每个可以与此代码一起使用的类中编写一个空白的void函数。
有没有人知道这个问题的解决方案?
解决方案
is_class
是Boost.Type_Traits库的成员。实现可能与您已有的类似。如果合适,您可以与 enable_if
一起使用来创建函数:
template <class T>
typename enable_if_c<boost::is_class<T>::value>::type
foo() { }
或同等的:
template <class T>
typename enable_if<boost::is_class<T>>::type
foo() { }
仅当 T
类型属于类类型时,才会生成 foo
函数。
函数的返回值(如果生成)是 enable_if
模板的第二个参数(省略)(默认为 void
)。
其他提示
使用boost的输入特征
如果它只是在编译期间断言,你可以使用 BOOST_STATIC_ASSERT
和 Boost.TypeTraits 来检查类型是否合适。如果您想为特定类型启用模板,您可能会成功使用Boost的 enable_if 。
不隶属于 StackOverflow