将数组引用到引用数组
Reference over array into array of reference
我有一些 T
、N
的数组 std::array<T, N> arr
,我想获得一个 arr
元素的引用数组,就像这样 std::array<std::reference_wrapper<T>, N> arr_ref
.
但是由于需要在初始化时设置引用,所以没有想出解决办法。
因此我想做这样的事情:
std::array<std::reference_wrapper<T>, N> ref{}
for (std::size_t i{0}; i < N; ++i)
ref[i] = arr[i];
但是在编译时和 ref
的初始化时。
我想过使用一些可变参数模板魔术将我的初始数组转换为参数包,然后引用每个元素,但我不确定这是否可行。
我最后的选择是原始指针数组或 std::optional<std::reference_wrapper<T>>
。
#include <array>
#include <functional>
#include <utility>
#include <cstddef>
template<typename x_Item, ::std::size_t x_count, ::std::size_t... x_index___>
auto wrap_impl(::std::array<x_Item, x_count> & items, ::std::index_sequence<x_index___...>)
{
return ::std::array<::std::reference_wrapper<x_Item>, x_count>{items[x_index___]...};
}
template<typename x_Item, ::std::size_t x_count>
auto wrap(::std::array<x_Item, x_count> & items)
{
return wrap_impl(items, ::std::make_index_sequence<x_count>{});
}
#include <iostream>
int main()
{
::std::array items{1, 2, 3};
auto wrapped_items{wrap(items)};
for (auto & wrapped_item: wrapped_items)
{
::std::cout << wrapped_item.get() << ::std::endl;
}
return 0;
}
我有一些 T
、N
的数组 std::array<T, N> arr
,我想获得一个 arr
元素的引用数组,就像这样 std::array<std::reference_wrapper<T>, N> arr_ref
.
但是由于需要在初始化时设置引用,所以没有想出解决办法。 因此我想做这样的事情:
std::array<std::reference_wrapper<T>, N> ref{}
for (std::size_t i{0}; i < N; ++i)
ref[i] = arr[i];
但是在编译时和 ref
的初始化时。
我想过使用一些可变参数模板魔术将我的初始数组转换为参数包,然后引用每个元素,但我不确定这是否可行。
我最后的选择是原始指针数组或 std::optional<std::reference_wrapper<T>>
。
#include <array>
#include <functional>
#include <utility>
#include <cstddef>
template<typename x_Item, ::std::size_t x_count, ::std::size_t... x_index___>
auto wrap_impl(::std::array<x_Item, x_count> & items, ::std::index_sequence<x_index___...>)
{
return ::std::array<::std::reference_wrapper<x_Item>, x_count>{items[x_index___]...};
}
template<typename x_Item, ::std::size_t x_count>
auto wrap(::std::array<x_Item, x_count> & items)
{
return wrap_impl(items, ::std::make_index_sequence<x_count>{});
}
#include <iostream>
int main()
{
::std::array items{1, 2, 3};
auto wrapped_items{wrap(items)};
for (auto & wrapped_item: wrapped_items)
{
::std::cout << wrapped_item.get() << ::std::endl;
}
return 0;
}