将多个源元组的元素复制到目标元组

Copying elements of multiple source tuples to the destination tuple

提问人:Konstantin Makarov 提问时间:11/3/2023 最后编辑:Jan SchultkeKonstantin Makarov 更新时间:11/3/2023 访问量:97

问:

我正在尝试将多个源元组中所有元素的值分配给一个目标元组的元素,如下所示:

#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...); }
C++ 标准图元组

评论

4赞 Some programmer dude 11/3/2023
所以基本上你想重新实现 std::tuple_cat
1赞 463035818_is_not_an_ai 11/3/2023
请注意,“如何修复此代码?”和“如何连接元组?”实际上是两个不同的问题,因为后者可以简单得多。也许澄清这是对元组和模板的练习,还是只是尝试完成它
1赞 Jarod42 11/3/2023
tr = std__tuple_cat(t1, t2, t3);?
0赞 Konstantin Makarov 11/3/2023
是的,这是一个关于元组的练习。更准确地说,是关于模板的练习。
0赞 Konstantin Makarov 11/3/2023
我想提前创建一个元组,然后多次分配元素。

答:

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
这确实是一个非常直观的线性解决方案。这样,我不仅可以对目标元组应用赋值,还可以对目标元组应用加法、减法和许多其他运算。谢谢。