为模板参数包生成整数序列

Generate Integer Sequence For Template Parameter Pack

有一个class方法模板我想调用参数包,定义为:

class C {
   template<int ... prp> void function() {}
}

对于给定的整数 N,我需要所有不超过 N 的整数作为参数包的模板实参。

constexpr int N = 2;

C c;
c.function<0, 1>();

我试过用std::integer_sequence,但是这里不能用

c.function<std::make_integer_sequence<int, N>>();

我还找到了这个答案: 我可以在偏特化中传递函数吗,例如使用 std::function?我无法将模板参数与 std::function.

一起使用

另外,class有多个函数我想用同样的方式调用。

c.function1<0, 1>();
c.function2<0, 1>();

一定有解决这个问题的好方法,但我还没有成功。仍在努力了解 TMP。

std::integer_sequence 作为参数传递怎么样?

我的意思如下

class C {
   template <int ... prp>
   void function (std::integer_sequence<int, prp...>)
   { /* ... */ }
}

您可以使用 std::make_integer_sequence

调用
constexpr int N = 2;

C c;

// this call function<0, 1>(std::integer_sequence<int, 0, 1>);
// the prp variadic list (0, 1, in this case) is deduced
c.function(std::make_integer_sequence<int, N>{});

(注意:代码未经测试)

您可以创建辅助函数:

template <int... Is>
void helper(C& c, std::integer_sequence<int, Is...>)
{
    c.function1<Is...>();
    c.function2<Is...>();
}

并称之为

constexpr int N = 2;
C c;

helper(c, std::make_integer_sequence<int, N>());