Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将模板类型限制为基类(不包括该基类的子类)?_C++_Templates_Sfinae - Fatal编程技术网

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