问题:
假设一个函数
void doFoo(const std::vector<std::reference_wrapper<DataT> >& data);
某些类型在哪里DataT
保存一些数据。我用std::vector
的只是一个容器类的典型例子。
你会说用 a 调用上述函数的最优雅的方法是std::vector<DataT>
什么?
背景:
在函数内部,doFoo(...)
我不想拥有数据的所有权。因此,我不想使用std::shared_ptr
or 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> >
,因为类型完全不相关。
可能的解决方案:
- 在调用函数之前创建一个
std::vector<std::reference_wrapper<DataT> >
,并用对dataVec
.
缺点:我必须为每个函数调用重新打包。 - 超载
doFoo(...)
采取std::vector<DataT>
并在那里进行重新包装。
缺点:如果我在很多地方使用这个概念,它会创建相当多的样板代码。此外,对我来说,有额外的函数调用似乎有点多余,甚至可能令人困惑。 std::vector<DataT>
启用从到 a 的一些隐式转换std::vector<std::reference_wrapper<DataT> >
。但我不知道这是否可能,以及它是否会产生一些不好的后果。如果这个或类似的东西是可能的和安全的,我会更喜欢这个解决方案。