gpt4 book ai didi

c++ - 模板类型如何限制为不包括该基类的子类的基类?

转载 作者:搜寻专家 更新时间:2023-10-31 01:25:02 25 4
gpt4 key购买 nike

我有两个类 ABB 派生自 A。现在,我尝试在带有模板参数 T 的第三类 C 的模板中使用此类。此模板应将 T 限制为从 A 派生的所有类,不包括 BB 的所有子类。我尝试以下方式:

template <typename T = 
std::enable_if<
(std::is_base_of<A, T>::value)
&&(!std::is_base_of<B, T>::value)>::type>
class C {};

这个模板可以被编译。但是如果我尝试使用它,例如使用 T = int,应用程序也可以编译。所以它也被接受为正确的参数值。应该怎样做才对?

最佳答案

我觉得用static_assert代替std::enable_if会更清楚,你可以自己指定错误信息。

template <typename T>
class C {
static_assert(std::is_base_of<A, T>::value && !std::is_base_of<B, T>::value,
"T must be classes derived from A excluding B and all subclasses of B.");
};

LIVE

如果你想坚持 std::enable_if,你需要保留模板参数 T,并使用 std::添加一个额外的模板参数:启用_if。请注意,当显式指定模板参数时,默认参数将不会生效(以限制类型)。例如

template <typename T, 
typename std::enable_if<(std::is_base_of<A, T>::value)
&& (!std::is_base_of<B, T>::value)>::type* = nullptr>
class C {
};

LIVE

关于c++ - 模板类型如何限制为不包括该基类的子类的基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57345481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com