C++ 如何将模板类型限制为基类(不包括该基类的子类)?
我有两个班C++ 如何将模板类型限制为基类(不包括该基类的子类)?,c++,templates,sfinae,C++,Templates,Sfinae,我有两个班A和BB源自A。现在,我尝试在模板中为第三个类C使用这些类,并使用模板参数T。此模板应将T限制为从A派生的所有类,不包括B和B的所有子类。我尝试以下方法: template <typename T = std::enable_if< (std::is_base_of<A, T>::value) &&(!std::is_base_of<B, T>::value)>::type> cl
A
和B
<代码>B源自A
。现在,我尝试在模板中为第三个类C
使用这些类,并使用模板参数T
。此模板应将T
限制为从A
派生的所有类,不包括B
和B
的所有子类。我尝试以下方法:
template <typename T =
std::enable_if<
(std::is_base_of<A, T>::value)
&&(!std::is_base_of<B, T>::value)>::type>
class C {};
模板::类型>
C类{};
这个模板可以编译。但是如果我尝试使用它,例如,使用
T=int
,应用程序也可以编译。因此,它也被认为是正确的参数值。如何正确执行?我认为使用static\u assert
而不是std::enable\u如果更清楚,您可以自己指定错误消息
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.");
};
另一种通过模板专门化的方法
template <typename, typename = void>
class C;
template <typename T>
class C<T, std::enable_if_t<true == std::is_base_of_v<A, T>
&& false == std::is_base_of_v<B, T>>>
{ };
模板
丙级;;
模板
C类
{ };
此外,这个解决方案不能“劫持”解释第二个模板参数
C<B, void> cb; // compilation error also explicating the second parameter
C cb;//解释第二个参数时也出现编译错误
当您显式传递模板参数时,默认值将被忽略,其中不会发生替换失败。您需要两个templateparameters才能工作。你通过一个,另一个就完了。
C<B, void> cb; // compilation error also explicating the second parameter