1

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

到目前为止,我已经有了这个:

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;
};

和用法:

is_class< int >::val; // false
is_class< some_class_type >::val; // true

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

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

4

3 回答 3

8

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() {  }

该函数foo仅在类型T为类类型时生成。

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

于 2009-05-06T07:53:42.413 回答
0

使用 boost 的类型特征

于 2009-05-06T07:42:44.390 回答
0

如果它只是在编译时断言,你可以使用BOOST_STATIC_ASSERTBoost.TypeTraits检查类型是否合适。如果您想为特定类型启用模板,您可能会成功使用 Boost 的enable_if

于 2009-05-06T07:45:09.750 回答