gpt4 book ai didi

c++ - 添加两个整数的可变参数模板列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:07 26 4
gpt4 key购买 nike

给定这个类型

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 模板参数。参数包知道自己的大小。

关于c++ - 添加两个整数的可变参数模板列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56235622/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com