0

问题:

假设一个函数

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

某些类型在哪里DataT保存一些数据。我用std::vector的只是一个容器类的典型例子。

你会说用 a 调用上述函数的最优雅的方法是std::vector<DataT>什么?

背景:

在函数内部,doFoo(...)我不想拥有数据的所有权。因此,我不想使用std::shared_ptror std::unique_ptr。据我了解,正确的方法是使用参考。如果我只使用对 a 的引用,std::vector<DataT>我可能必须复制几个DataT来为函数调用创建向量,以防我没有直接在 a 中构造数据std::vector<DataT>。因此,astd::vector<std::reference_wrapper<DataT> >似乎是最好的解决方案。

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

可能的解决方案:

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

1 回答 1

1

我在这里看到了一些选项。

1.使用向量的迭代器构造函数。

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

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

2.std::vector<DataT> const &用作doFoo参数并将数据移动到向量中。

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

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

它将所有权转移给向量(但不转移给函数)!

3.DataT如果要处理的向量不止一个,一般对向量中的s进行操作。

如果您周围没有多个DataT对象,则需要将其复制到向量中,则不需要reference_wrapper。

于 2015-07-10T16:34:25.927 回答