C++模板:如何确定类型是否适合子类化

dou*_*lep 11 c++ type-traits template-meta-programming

假设我有一些模板类,具体取决于类型T. T可能是几乎所有的东西:int,int*,pair <int, int>struct lol; 它不能void,参考或任何cv资格但是.对于某些优化,我需要知道我是否可以继承T.所以,我需要一些特质类型is_subclassable,确定为基本特征的逻辑组合或通过一些SFINAE技巧.

在原始示例中,int并且int*不是子类,pair <int, int>而且struct lol是.

编辑:正如下面指出的litb,工会也不是可子类化的,T也可以是联合类型.

如何编写我需要的特征类型?

Joh*_*itb 13

您想确定它是否是非联合类.我不知道这样做(并且还没有找到方法).如果你可以忍受工会案件误报,你可以使用is_class.

template<typename> struct void_ { typedef void type; };

template<typename T, typename = void>
struct is_class { static bool const value = false; };

template<typename T>
struct is_class<T, typename void_<int T::*>::type> { 
  static bool const value = true; 
};
Run Code Online (Sandbox Code Playgroud)

Boost有一个is_union使用特定于编译器的内置函数,这将在这里帮助您.is_class(提升也提供)结合is_union将解决您的问题.