为模板参数包生成整数序列
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>());
有一个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>>();
我还找到了这个答案:
另外,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>());