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


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

在原始的例子中, int 和 int* 不是可子类化的,而 pair <int, int> 和 struct lol 是。

编辑:正如litb指出的那样,工会也不是可继承的 T 也可以是联合类型。

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


2433
2018-06-30 20:48


起源

嗯。将 is_class 够了吗?不确定。 - Benjamin Lindley


答案:


您想确定它是否是非联合类。我不知道这样做(并且还没有找到方法)。如果你可以忍受工会案件误报,你可以使用 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 会解决你的问题。


13
2018-06-30 20:53



我完全忘记了工会案件。不幸的是,误报是不可接受的。遗漏是因为这毕竟是一种优化。 - doublep
@doublep然后,除非你使用c ++ 0x,我不认为它可以以可移植的方式解决。 - Johannes Schaub - litb
是的,我想我必须以C ++ 0x支持为条件进行优化,或者只是放弃它。 - doublep
is_class 除非gcc在这里错误,否则对于工会不会解决为真: ideone.com/P1J6d - Benjamin Lindley
@litb:后来的标准草案说的 is_class:“T 是类类型,但不是联合类型(3.9.2)“。 - doublep