11

假设我有一些模板类,具体取决于 type TT几乎可以是任何东西:int、、int*或;它不能是,参考或任何 cv 限定的。对于一些优化,我需要知道我是否可以子类化. 所以,我需要一些 trait type ,确定为基本特征的逻辑组合或通过一些 SFINAE 技巧。pair <int, int>struct lolvoidTis_subclassable

在原始示例中,intandint*是不可子类化的,whilepair <int, int>struct lolare。

编辑:正如 litb 在下面指出的那样,联合也不是可子类化的,T也可以是联合类型。

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

4

1 回答 1

13

您想确定它是否是非联合类。我没有办法做到这一点(而且 boost 也没有找到办法)。如果您可以忍受工会案例误报,您可以使用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(boost 也提供)结合is_union将解决您的问题。

于 2011-06-30T20:53:47.973 回答