C++模板:如何确定一个类型是否适合子类化
C++ templates: how to determine if a type is suitable for subclassing
假设我有一些依赖于类型T
的模板化类。T
几乎可以是任何东西:int
、int*
、pair <int, int>
或struct lol
;它不能是void
,一个参考或任何cv限定。对于一些优化,我需要知道我是否可以将T
子类化。所以,我需要一些特质类型is_subclassable
,确定为基本特质的逻辑组合,或者通过一些SFINAE技巧。
在原始示例中,int
和int*
是不可子类的,而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
相结合将解决您的问题。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 是否可以从int转换为enum类类型
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 函数作为模板参数,是否对返回类型强制约束
- JS相等运算符(如===)是否可以使用embind类型
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 检查函数返回类型是否与STL容器类型值相同
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 检查某些类型是否是模板类 std::optional 的实例化
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- boost 是否有按特殊类型值编码状态"compact optional"?
- 初始值设定项列表是否只接受使用相同类型的值初始化变量?
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 在运行时检查继承是否只有一种类型和 void*
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- 当返回类型声明为 ListNode 时,我们是否可以返回 false<T>*