c++ - 有没有办法获得给定数量的输入,其中数字由 C++ 编译时的模板给出?
问题描述
例如,假设我创建了一个如下所示的类:
template <unsigned int INPUT_SIZE>
class A{
public:
int operator()(int input, ...){ // get INPUT_SIZE-many inputs
// return sum;
}
};
我想获得与 INPUT_SIZE 一样多的输入,而不是更多或更少。我怎样才能做到这一点?
另外,我用的是c++11,但是如果c++14或以上有更好的方法,我也想知道。
解决方案
template <class T, auto> using always_t = T;
template <class T, class Arity>
struct A_impl;
template <class T, std::size_t... Is>
struct A_impl<T, std::index_sequence<Is...>>
{
int operator ()(always_t<T, Is>...)
{
return 0;
}
};
template <std::size_t N>
struct A : A_impl<int, std::make_index_sequence<N>>
{ };
A<2>{}(1, 2); // fine
A<2>{}(1, 2, 3); // fail
这是一个允许您计算参数总和的版本:
template <class T, auto> using always_t = T;
template <class T, class Arity>
struct A_impl;
template <class T, std::size_t... Is>
struct A_impl<T, std::index_sequence<Is...>>
{
constexpr int operator ()(std::tuple<always_t<T, Is>...>&& t) {
auto adder = [](auto... ts) {
return (0 + ... + ts);
};
return std::apply(adder, std::move(t));
}
};
template <std::size_t N>
struct A : A_impl<int, std::make_index_sequence<N>>{
};
constexpr int sum = A<3>{}({1, 4, 5});
static_assert(sum == 10);
诀窍是使用带长度的参数包N
,以便我们可以使用它将N
特定类型扩展为A_impl::operator()
.
参数包可以扩展为N
(通常)之前的模式的重复...
考虑如下函数:
template<class... T>
void foo(T...);
T...
简而言之,它可以被连续的类型替换到参数列表中foo
,一种可能的扩展可能是foo(int, int, double, char)
,还要注意什么 preside...
是来自的标识符class... T
。
回到代码,我们需要生成一个参数包,我们通过std::make_index_sequence<N>
,生成由0..(N-1)
捕获的序列std::size_t... Is
,然后我们使用这个包来扩展always_t<T, Is>
只是一个别名的模式T=int
,这最终重复T=int
了很多次作为元素Is
包含。
注意:省略号参数...
与参数包不同。
推荐阅读
- javascript - TypeError:无法读取未定义的属性“时间”
- javascript - JavaScript:基于排列顺序对数组进行排序?
- python - Python 和 SQL 查询
- javascript - 为什么console.log需要包装在一个react函数中
- python - 检查鼠标位置是否在区域pygame
- reactjs - 本地主机 windows10 长时间响应
- database - 实体之间的数据库关系
- r - 将json转换为geojson
- php - 用 PHP 写一个 BMI 计算器
- youtube-api - 每次使用 JAVA 将视频上传到 Youtbe 时都需要 Google 登录吗?