多参数包——如何

Multiple parameter packs -- how?

本文关键字:如何 参数      更新时间:2023-10-16

我有以下问题:

#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的模板实参。
不幸的是,代码不能编译:

错误:期望在' t '前嵌套名称说明符

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

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

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;

考虑错误:

期望在' t '前嵌套名称说明符

这是因为你写了:

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