c++将多个模板类类型限制为派生类

标签 c++ templates c++11

我正在关注 template class restriction ,但在 gcc 中遇到错误:

错误:一个声明中有多个类型

错误:声明没有声明任何东西

如果我删除 enable_if block ,它会编译。如果我遗漏了什么,谁能解释一下?

template<class A, class B, class C, class D>                                                                               
typename std::enable_if<                                                  
std::is_base_of<baseofA, A>::value &&                      
std::is_base_of<baseofB, B>::value &&      
std::is_base_of<baseofC, C>::value &&            
std::is_base_of<baseofD, D>::value>::type       
class library {
    //whatever
};

最佳答案

您没有正确使用 enable_ifstatic_assert 在这种情况下会更合适。

template<class A, class B, class C, class D>       
class library {
  static_assert(
    std::is_base_of<baseofA, A>::value &&                      
    std::is_base_of<baseofB, B>::value &&      
    std::is_base_of<baseofC, C>::value &&            
    std::is_base_of<baseofD, D>::value, 
    "template argument A must derive from baseofA and so on ..." );
      //whatever
};

如果您想使用 enable_if 而不是,您必须创建一个虚拟模板参数,该参数取决于启用的类型,以便它按您的期望工作。

template<class A, 
         class B, 
         class C, 
         class D, 
         class _ = 
           typename std::enable_if<                                                  
             std::is_base_of<baseofA, A>::value &&                      
             std::is_base_of<baseofB, B>::value &&      
             std::is_base_of<baseofC, C>::value &&            
             std::is_base_of<baseofD, D>::value>
           ::type>
class library {
    //whatever
};

但是 IMO,static_assert 方法更好,因为您可以提供描述性错误消息,而不是编译器在后一种情况下提示未能找到名为 type 的类型.

关于c++将多个模板类类型限制为派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10989956/

相关文章:

lambda - lambda 函数的类型是什么?

c++ - 在创建 SDL 窗口后更改 OpenGL 抗锯齿?

c++ - 查找字符串是否包含字符串并处理附加数字

返回类型之前的 C++11 结构

django - 覆盖 django-allauth 中的模板

c++ - 具有未初始化成员的结构的 constexpr 默认构造函数仅在模板化时有效

c++ - 创建仅接受引用或指针的可变参数

C++ 入门(第 5 版);第 19 章 - 算法:std::lower_bound

c++ - 模块化计算器中的错误答案

c++ - 固定尺寸表