c – 如何使用可变模板参数enable_if一个类?

假设我有一个具有以下签名的类:
template <typename T,typename... Args>
class A;

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

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

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

template <typename T,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 std::enable_if<!T::value>::type,Args...> {
    // code here
};
}

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

如果条件真的是一个bool,那么Jonathan’s way也是非常好的,但是如果你希望添加更多的专业化,这些专业化依赖于几个条件,这可能并不有用.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...