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

StackOverflow https://stackoverflow.com/questions/828442

  •  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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top