多个参数包 - 如何?

abr*_*ert 6 c++ templates variadic-templates c++14

我有以下问题:

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

错误:'Ts'之前的预期嵌套名称说明符

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

Sam*_*hik 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;
    };
};
Run Code Online (Sandbox Code Playgroud)

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

initial_values<1,2,3>::A<int, char> a;
Run Code Online (Sandbox Code Playgroud)


sky*_*ack 6

考虑一下错误:

'Ts' 之前应有嵌套名称说明符

这是因为您写道:

template< size_t... N_i, typename Ts... >
Run Code Online (Sandbox Code Playgroud)

代替:

template< size_t... N_i, typename... Ts >
Run Code Online (Sandbox Code Playgroud)

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

例如,您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)