提问人:Konstantin Makarov 提问时间:11/3/2023 最后编辑:Jan SchultkeKonstantin Makarov 更新时间:11/3/2023 访问量:97
将多个源元组的元素复制到目标元组
Copying elements of multiple source tuples to the destination tuple
问:
我正在尝试将多个源元组中所有元素的值分配给一个目标元组的元素,如下所示:
#include <tuple>
template<std::size_t from_element, typename dstT, typename srcTs, std::size_t... Is>
void assign_elms(dstT& dst, const srcTs& src, std::index_sequence<Is...>) {
((std::get<from_element + Is>(dst) = std::get<Is>(src)), ...);
}
template<std::size_t from_element, typename dstT, typename srcT>
void assign_impl(dstT& dst, const srcT& src) {
assign_elms<from_element>(dst, src, std::make_index_sequence<std::tuple_size_v<srcT>>());
}
template<typename dstT, typename... srsTs>
void assign(dstT& dst, const srsTs&... srcs) {
(assign_impl<???>(dst, srcs), ...); // ???
}
template<typename... Ts>
using tuple_concat_t = decltype(std::tuple_cat(std::declval<Ts>()...));
int main() {
std::tuple t1{ 1, 2.2f, 3.33 };
std::tuple t2{ 4, 5.5f };
std::tuple t3{ 6 };
tuple_concat_t<decltype(t1), decltype(t2), decltype(t3)> tr;
assign(tr, t1, t2, t3); // required (1, 2.2f, 3.33, 4, 5.5f, 6)
}
我想提前创建一个目标元组,然后多次分配元素。 但我不知道该用什么代替“???”。 请帮帮我。
我使用递归解决了这个问题,但我想在没有递归的情况下做到这一点。
创建一个新的元组不适合我:
template <typename... Ts>
auto tuple_concat(const Ts&... srcs) { return std::tuple_cat(srcs...); }
答:
2赞
Jarod42
11/3/2023
#1
您可以创建一个偏移量数组并遍历它:
template<typename dstT, typename... srsTs>
void assign(dstT& dst, const srsTs&... srcs) {
constexpr std::array offsets = [](){
std::array<std::size_t, 1 + sizeof...(srcs)> res{{0, std::tuple_size_v<srsTs>...}};
std::partial_sum(res.begin(), res.end(), res.begin());
return res;
}();
[&]<std::size_t...Is>(std::index_sequence<Is...>){
(assign_impl<offsets[Is]>(dst, srcs), ...);
}(std::make_index_sequence<sizeof...(srsTs)>());
}
演示。
评论
0赞
Konstantin Makarov
11/3/2023
这确实是一个非常直观的线性解决方案。这样,我不仅可以对目标元组应用赋值,还可以对目标元组应用加法、减法和许多其他运算。谢谢。
评论
std::tuple_cat
?tr = std__tuple_cat(t1, t2, t3);
?