假设我有一个具有以下签名的类:
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/