c++ - 添加两个可变参数模板整数列表
问题描述
鉴于这种类型
template<std::size_t N, int ...content>
struct list {
inline int reduce() {
int result = 0;
constexpr int arr[N] = { content... };
for(std::size_t k = 0; k < N; ++k) {
result += arr[k];
}
return result;
}
};
我想实现一个函数add
,它返回一个新列表,其中包含两个输入列表的逐个元素相加。换句话说(伪代码):
add([a0, a1, a2], [b0, b1]) -> [a0 + b0, a1 + b2, a2]
问题:
- 我什至不知道如何声明这样一个函数的返回类型
- 我不知道这是否可能
解决方案
这是我的做法:
#include <iostream>
#include <utility>
template<std::size_t N, int ...content>
struct list {
inline int reduce() {
int result = 0;
constexpr int arr[N] = { content... };
for(std::size_t k = 0; k < N; ++k) {
result += arr[k];
}
return result;
}
};
template <std::size_t I, int ...A>
constexpr int list_at(list<sizeof...(A),A...>)
{
if constexpr (I < sizeof...(A))
{
constexpr int arr[] {A...};
return arr[I];
}
else
{
return 0;
}
}
template <int ...A, int ...B, std::size_t ...I>
constexpr auto list_sum_low(list<sizeof...(A),A...>,
list<sizeof...(B),B...>,
std::index_sequence<I...>)
{
return list<sizeof...(I), (list_at<I>(list<sizeof...(A),A...>{}) +
list_at<I>(list<sizeof...(B),B...>{}))...>{};
}
template <int ...A, int ...B>
constexpr auto list_sum(list<sizeof...(A),A...>, list<sizeof...(B),B...>)
{
constexpr int a = sizeof...(A), b = sizeof...(B);
return list_sum_low(list<a,A...>{}, list<b,B...>{},
std::make_index_sequence<(a > b ? a : b)>{});
}
template <int ...A>
void print_list(list<sizeof...(A),A...>)
{
(void(std::cout << ' ' << A) , ...);
}
int main()
{
constexpr auto x = list_sum(list<4, 1,2,3,4>{}, list<2, 10,20>{});
print_list(x);
}
另外,请注意,不需要size_t N
为class list
. 参数包知道自己的大小。
推荐阅读
- python - 如何让不和谐机器人(Python)等待嵌入 url 消息有内容?
- amazon-web-services - 我可以为 sagemaker.sklearn.estimator 的 SKLearn 指定 S3 存储桶吗?
- html - 在 django 模板中的 for 循环创建的列表中定义一个元素作为默认值
- c# - 生命周期范围是否包含对非一次性组件的引用?
- elasticsearch - ElasticSearch,多索引搜索
- flutter - TextEditingController 返回 null ,不考虑我在文本字段中键入的输入
- c - 如何在平方根函数中使用存储为字符的数字?
- javascript - 如何通过javascript中的if语句更改输入ID内的值
- python - 脚本 sqlformat.exe 安装在目录中,该目录不在 PATH 上
- r - R中是否有一个函数来填充变量中的缺失数据