c++ - 如何启用_if 具有可变模板参数的类?

标签 c++ templates

假设我有一个具有以下签名的类:

template <typename T, typename... Args>
class A;

但是这个类的行为应该取决于其他一些参数,假设它是 T::value:

的值
template <typename T, typename... Args, typename Enable>
class A;

template <typename T, typename... Args, typename = typename std::enable_if<T::value>::type>
class A
{
  // do something
};

template <typename T, typename... Args, typename = typename std::enable_if<!T::value>::type>
class A
{
  // do something else
};

int main() { return 0; }

但是,这个程序给出了以下错误:

prog.cpp:6:11: error: parameter pack ‘Args’ must be at the end of the template parameter list class A;

我一直在努力寻找关于使用 enable_if 选择具有可变参数模板的类的良好信息来源。我能找到的唯一问题是这个:

How to use std::enable_if with variadic template

但尽管名称如此,但这个问题及其答案并没有多大帮助。如果有人可以提供或链接指南,说明应该如何处理以及为什么会这样做。

最佳答案

首先,您正在尝试编写类模板的多个定义。这是不允许的,因为它违反了一个定义规则。如果您想对类进行条件启用,您需要特化。此外,编译器错误消息已经告诉您,参数列表中间不能有可变参数包。

一种方法是:

namespace detail {

template<typename T, typename Enable, typename... Args>
class A_impl;

template<typename T, typename... Args>
class A_impl<T, typename std::enable_if<T::value>::type, Args...> {
    // code here
};

template<typename T, typename... Args>
class A_impl<T, typename std::enable_if<!T::value>::type, Args...> {
    // code here
};
}

template<typename T, typename...Args>
class A : public detail::A_impl<T, void, Args...> {};

Jonathan's way如果条件真的是一个 bool 也很好,但如果你想添加更多的特化,每个特化都依赖于几个条件,它可能没有用。

关于c++ - 如何启用_if 具有可变模板参数的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26421104/

相关文章:

c++ - 为什么编译器选择这个模板函数而不是重载的非模板函数?

c++ - 插入稀疏矩阵时出现问题

c++ - Windows7中的硬件加速缩放MFT

c++ - 访问结构数组中的 std::unordered_map 时出现浮点错误

c++ - 从 C++ (STL) 中的(它的)迭代器类型获取容器类型

C++ 3D vector 模板

c++ - 带有字符而不是字节的 substr

c++ - 如何使用 boost::asio 发送原始二进制数据

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

c++ - 在 C++ 中使用宏生成函数