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

C++ templates: how to determine if a type is suitable for subclassing

本文关键字:是否 类型 一个 子类 模板 何确定 C++      更新时间:2023-10-16

假设我有一些依赖于类型T的模板化类。T几乎可以是任何东西:intint*pair <int, int>struct lol;它不能是void,一个参考或任何cv限定。对于一些优化,我需要知道我是否可以将T子类化。所以,我需要一些特质类型is_subclassable,确定为基本特质的逻辑组合,或者通过一些SFINAE技巧。

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

EDIT:正如litb在下面指出的,并集也是不可子类的,T也可以是并集类型。

我该如何写出我需要的特质类型?

您需要确定它是否是非并集类。我不知道该怎么做(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相结合将解决您的问题。

相关文章: