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...> {};