gpt4 book ai didi

c++ - 我应该如何将容器转换为 reference_wrappers 的容器?

转载 作者:行者123 更新时间:2023-11-28 06:10:38 27 4
gpt4 key购买 nike

问题:

假设一个函数

void doFoo(const std::vector<std::reference_wrapper<DataT> >& data);

哪里DataT是保存一些数据的某种类型。我用了std::vector就像容器类的典型例子。

您认为用 std::vector<DataT> 调用上述函数的最优雅方式是什么? ?

背景:

函数内部doFoo(...)我不想取得数据的所有权。因此,我不想使用 std::shared_ptrstd::unique_ptr .据我了解,正确的方法是使用引用。如果我只是使用对 std::vector<DataT> 的引用我可能需要复制几个 DataT为函数调用创建 vector ,以防我没有直接在 std::vector<DataT> 中构造数据.因此,一个 std::vector<std::reference_wrapper<DataT> >似乎是最好的解决方案。

如果我只有一个 DataT对象(我们称它为 data1 )我可以通过调用 doFoo({data1}) 轻松地将它放入函数中并且将隐式构造正确的 vector 。但是如果我已经有了 std::vector<DataT> dataVec并尝试调用doFoo(dataVec)它不会隐式转换为 std::vector<std::reference_wrapper<DataT> > ,因为类型完全不相关。

可能的解决方案:

  1. 创建 std::vector<std::reference_wrapper<DataT> >在调用该函数之前,用对 dataVec 中所有元素的引用填充它.
    缺点:我必须为每个函数调用重新打包。
  2. 重载doFoo(...)采取std::vector<DataT>并在那里重新包装。
    缺点:如果我在很多地方使用这个概念,它会创建相当多的样板代码。此外,对我来说,调用额外的函数似乎有点多余,甚至可能令人困惑。
  3. std::vector<DataT>启用一些隐式转换到 std::vector<std::reference_wrapper<DataT> > .但我完全不知道这是否可能,以及是否会产生一些不良后果。如果这个或类似的东西是可能的和安全的,我会更喜欢这个解决方案。

最佳答案

我在这里看到一些选项。

<强>1。使用 vector 的迭代器构造函数。

std::vector<DataT> x;
doFoo({x.begin(), x.end()});

这应该从 vector 构造一个引用包装器的 vector ,因为迭代器无论如何都会引用对象。

<强>2。使用 std::vector<DataT> const &作为doFoo参数并将您的数据移动到 vector 中。

如果您的数据在某处,您可以将它们移动到 vector 中而不是复制(如果移动 DataT 有意义)。

DataT d1, d2, d3;
std::vector<DataT> v { std::move(d1), std::move(d2), std::move(d3) };
dooFoo(v);

将所有权转移给 vector (但不转移给函数)!

<强>3。一般在DataT上操作如果要处理的对象不止一个,则在一个 vector 中。

如果您没有多个 DataT周围的对象需要复制到 vector 中,不需要 reference_wrapper。

关于c++ - 我应该如何将容器转换为 reference_wrappers 的容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31345597/

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