gpt4 book ai didi

c++ - 展开和转发阵列

转载 作者:行者123 更新时间:2023-12-02 10:12:31 25 4
gpt4 key购买 nike

我在展开并将std::arrays的参数包转发到另一个函数时遇到麻烦
假设我们有一个采用单个std::array的函数,我想将其展开并将其作为参数传递给其他函数,我可以这样做:

template<typename T, typename...Ts>
void other_function(T, Ts...) { /* Do stuff with Ts */ }

template<typename T, size_t Size, size_t... I>
void forward_array(std::array<T, Size>& array_arg, std::index_sequence<I...>)
{
other_function(array_arg[I]...);
// for Size == 3 let's say we get the same thing as we would write
// other_function(array_arg[0], array_arg[1], array_arg[2]
// I skipped the std::forward
}

现在,我们有一个函数可以执行相同的操作,但是它需要多个大小可能不同的数组。
template<typename T, size_t... Sizes /*, size_t... I_Sequence0, size_t... I_Sequence1, ... I_SequenceN */>
void forward_many_arrays(std::array<T, Sizes>&... array_args /*, ???*/)
{
other_func( /* ??? */);
}
我想展开每个array_arg并将其传递给other_func,但是我该如何在这里正确地做到这一点?我们需要一种索引每个数组arg的方法。
在我的实际程序中,我有一个类,该类具有std::reference_wrapper的成员std::array,该成员不是默认可构造的,并且我正在尝试为该类提供一个替代构造函数,该构造函数可以使用任意数量的arrays&它们的大小与成员数组的大小匹配,并将其委派给采用T引用的显式构造函数,但是我有点卡住了,因为我不知道如何处理展开。

最佳答案

您可能有一个“通用” setter/getter

template <std::size_t I, typename Container, typename ... Containers>
decltype(auto) get(Container&& container, Containers&&...containers)
{
constexpr std::size_t size = std::tuple_size_v<std::decay_t<Container>>;
if constexpr (I < size) {
return container[I];
} else {
return get<I - size>(containers...);
}
}
像这样使用:
template <typename...Ts>
void other_function(Ts... ts) { ((std::cout << ts << " "), ...); }

template<typename... Ts, size_t... Is>
void forward_many_arrays(std::index_sequence<Is...>, Ts&&...ts)
{
other_function(get<Is>(ts...)...);
}

template<typename... Ts>
void forward_many_arrays(Ts&&...ts)
{
forward_many_arrays(std::make_index_sequence<(std::tuple_size_v<std::decay_t<Ts>> + ...)>(), ts...);
}
Demo

关于c++ - 展开和转发阵列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62980365/

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