初始化reference_wrapper数组
Initialize an array of reference_wrapper
从C到C++,我试图理解智能指针和引用的世界。我有以下几点:
class Game {
public:
...
private:
...
static GamePiece EmptyPiece;
reference_wrapper<GamePiece> _board[N][M] = { ref(Game::EmptyPiece) };
vector<GamePlayer> _players = vector<GamePlayer>(N_PLAYERS, GamePlayer());
...
};
在以下情况下,我希望每个Player
都持有一个vector<GamePiece>
并返回对这些片段的引用,然后放入_board
中。但是,我的_board
的以下初始化会产生
类"std::reference_wrapper 不存在默认构造函数
我在这里错过了什么?在所有权方面,每个GamePlayer
都归Game
所有(可以看出),GamePiece
肯定归GamePlayer
所有,这就是为什么我想使用引用。
就是这里
reference_wrapper<GamePiece> _board[N][M] = { ref(Game::EmptyPiece) };
您初始化第一个元素(加入一些大括号省略号),但保留其余默认值初始化。这不可能发生,因为std::reference_wrapper
不能默认初始化(就像它建模的引用一样)。
您可以将原始数组替换为N*M
大小的std::vector
,并使用适当的构造函数来复制初始化所有元素(就像您对_players
所做的那样)。当然,您需要自己进行索引计算,但内存将按顺序布局。
在我看来,初始化引用数组很痛苦。问题是 - 正如@StoryTeller的回答中所述 -reference_wrapper
不是默认可构造的。
因此,您必须编写自己的解决方法函数。我将发布初始化引用数组的一般问题的代码,不会深入探讨您的问题。
因此,请考虑以下情况:您有一个数组arr
其中包含支持operator[]
的某种类型的元素(例如,您的问题中的Game
)。您需要一个常量或非常量引用数组,这些引用由索引ind
指定的此数组中的元素。给你:
template<typename arr_t, size_t ... I>
auto get_const_reference_array(arr_t const& arr, std::array<size_t, sizeof ...(I)> const& ind, std::index_sequence<I...>)
{
using T = std::decay_t<decltype(std::declval<arr_t>().operator[](size_t{}))>;
return std::array<std::reference_wrapper<const T>, sizeof ...(I)> { std::cref(arr[std::get<I>(ind)]) ... };
}
template<typename arr_t, size_t dim>
auto get_const_reference_array(arr_t const& arr, std::array<size_t, dim> const& ind)
{
return get_const_reference_array(arr, ind, std::make_index_sequence<dim>{});
}
对于非 const 版本,请删除此代码中的所有const
,并将std::cref
替换为std::ref
。
将其用作
std::array<int,5> arr{{1,3,5,7,9}};
std::array<size_t,2> ind{{1,3}};
auto ref_arr = get_const_reference_array(arr, ind);
std::vector<int> vec{{1,3,5,7,9}};
auto ref_vec = get_const_reference_array(vec, ind);
然后ref_arr
是一个大小2
数组,其中包含对arr[1]
和arr[3]
的常量引用,对于向量也是如此(但请注意,对向量的引用通常不稳定,即通过调整大小或类似的操作,它们可能会失效)。
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '