C++ 如果类具有可变模板参数,如何启用_?
假设我有一个具有以下签名的类:C++ 如果类具有可变模板参数,如何启用_?,c++,templates,C++,Templates,假设我有一个具有以下签名的类: template <typename T, typename... Args> class A; 但是,此程序会出现以下错误: 程序cpp:6:11:错误:参数包“Args”必须位于 模板参数列表 甲级 我一直在努力寻找关于使用enable_if选择具有可变模板的类的良好信息源。我能找到的唯一问题是: 但是,尽管有这个名字,这个问题及其答案并没有多大帮助。如果有人可以提供或链接一个指南,说明如何处理这个问题,以及为什么这样做,我们将不胜感激。就您的
template <typename T, typename... Args>
class A;
但是,此程序会出现以下错误:
程序cpp:6:11:错误:参数包“Args”必须位于
模板参数列表
甲级
我一直在努力寻找关于使用enable_if
选择具有可变模板的类的良好信息源。我能找到的唯一问题是:
但是,尽管有这个名字,这个问题及其答案并没有多大帮助。如果有人可以提供或链接一个指南,说明如何处理这个问题,以及为什么这样做,我们将不胜感激。就您的目的而言,您似乎不需要启用/禁用该类,您只需要部分专门化:
template <typename T, bool B = T::value, typename... Args>
class A;
template <typename T, typename... Args>
class A<T, true, Args...>;
template <typename T, typename... Args>
class A<T, false, Args...>;
模板
甲级;
模板
甲级;
模板
甲级;
首先,您尝试编写一个类模板的多个定义。这是不允许的,因为它违反了一条定义规则。如果要对类执行条件启用,则需要专门化。此外,编译器错误消息已经告诉过你,在参数列表中间不能有一个变量参数包。
一种方法是:
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...> {};
名称空间详细信息{
模板
甲级执行;
模板
甲级执行{
//代码在这里
};
模板
甲级执行{
//代码在这里
};
}
模板
A类:公共细节::A_impl{};
如果条件真的是一个
bool
,它也很好,但是如果您希望添加更多的专门化,并且每个专门化都取决于几个条件,那么它可能不会有用。我认为使用更接近OP想要的是,很简单,然后将其包装在一个别名中以使其更方便用户。我尝试声明a代码>,但编译器一直告诉我:“未定义模板的隐式实例化细节::A_impl
。如果你能解释一下,我将非常感激。(抱歉,我还在学习这些东西).@astroboylrx要使其工作,模板参数列表中A
的第一个类型需要有值成员,因为签入启用\u if
取决于它。您使用了浮动。如果没有值成员,签入启用\u if
无效,因此主模板如果选择了一个A_impl
(它没有实现,只是声明了),您就会得到错误。很抱歉我的回复太晚。谢谢您的解释。我现在看到了。:-)
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...> {};