多个参数包 - 如何?

时间:2016-10-14 21:07:41

标签: c++ templates c++14 variadic-templates

我有以下问题:

#include <vector>
#include <tuple>

using namespace std;

template< size_t... N_i, typename Ts... >
class A
{
  // ...

  private:
    std::vector<size_t> _v = { N_i... };
    std::tuple<Ts...> _t;
};

int main()
{
  A<1> a;
}

如上所示,我尝试将多个参数包定义为类A的模板参数 不幸的是,代码无法编译:

  

错误:在&#39; Ts&#39;

之前预期的嵌套名称说明符

如何为此示例定义多个参数包?

2 个答案:

答案 0 :(得分:8)

实现最终目标的一种方法是使用嵌套模板:

template< size_t... N_i> class initial_values {

public:

    template <typename Ts...>
    class A
    {
       // ...

       private:
         std::vector<size_t> _v = { N_i... };
         std::tuple<Ts...> _t;
    };
};

然后可以引用模板,例如:

initial_values<1,2,3>::A<int, char> a;

答案 1 :(得分:2)

考虑错误:

  

在'Ts'

之前预期的嵌套名称说明符

这是因为你写了:

template< size_t... N_i, typename Ts... >

而不是:

template< size_t... N_i, typename... Ts >

也就是说,即使您修复它,代码也无法编译 这是因为你不能像你那样混合两个参数包 您必须重构代码,以便能够以某种方式从上下文中推断出它们。

例如,您可以使用std::index_sequence和部分专业化,如下所示:

#include <vector>
#include <tuple>
#include<functional>

using namespace std;

template< typename... >
class A;

template< size_t... N_i, typename... Ts >
class A<index_sequence<N_i...>, Ts...>
{
  // ...

  private:
    std::vector<size_t> _v = { N_i... };
    std::tuple<Ts...> _t;
};

int main()
{
  A<index_sequence<1>> a;
}