如果变量是c ++中的类,结构或基本类型,有没有办法编译时断言?

Dom*_*kar 1 c++ templates typechecking

我正在尝试实现一个模板类,它能够告诉我变量是类,结构还是基本类型.

到目前为止,我已经来了:

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;
};
Run Code Online (Sandbox Code Playgroud)

和ussage:

is_class< int >::val; // false
is_class< some_class_type >::val; // true
Run Code Online (Sandbox Code Playgroud)

问题是现在我需要在每个可以与此代码一起使用的类中编写一个空白的void函数.

有谁知道这个问题的解决方案?

180*_*ION 8

is_class是Boost.Type_Traits库的成员.实现可能与您已有的类似.enable_if如果合适,您可以结合使用来创建函数:

template <class T>
   typename enable_if_c<boost::is_class<T>::value>::type 
     foo() {  }
Run Code Online (Sandbox Code Playgroud)

或等效的:

template <class T>
   typename enable_if<boost::is_class<T>>::type 
     foo() {  }
Run Code Online (Sandbox Code Playgroud)

foo仅当类型T为类类型时才会生成该函数.

函数的返回值(如果生成)是enable_if模板的第二个参数(省略)(默认值为void).