假设我有一些模板类,具体取决于类型 T
。 T
几乎可以是任何东西: int
, int*
, pair <int, int>
要么 struct lol
;它不可能是 void
,参考或任何cv资格但是。对于一些优化,我需要知道我是否可以继承 T
。所以,我需要一些特质类型 is_subclassable
,确定为基本特征的逻辑组合或通过一些SFINAE技巧。
在原始的例子中, int
和 int*
不是可子类化的,而 pair <int, int>
和 struct lol
是。
编辑:正如litb指出的那样,工会也不是可继承的 T
也可以是联合类型。
如何编写我需要的特征类型?
您想确定它是否是非联合类。我不知道这样做(并且还没有找到方法)。如果你可以忍受工会案件误报,你可以使用 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;
};
Boost有一个 is_union
虽然使用编译器特定的内置,这将在这里帮助您。 is_class
(也提供了提升)结合 is_union
会解决你的问题。