C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – std :: reference_wrapper在容器中的用法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我可以从我的代码删除所有原始指针*,因为使用它们可能不是线程安全的,并且设计的意图不清楚(可选的值,所有权等).
有时候,不要使用指针是不容易的.例如,我们倾向于在多态类型的容器中使用基类型的指针:
class A : noncopyable { ... };
class B : public A { ... };

std::vector<A*> v;
v.emplace_BACk(new B);

// temporary container for some operation
std::vector<A*> SELEcted;
if(check())
   SELEcted.emplace_BACk(v.front());

你上面的代码可以说什么?谁是主人?是不是共享所有权?这就是为什么我们应该这样做v:

std::vector<std::unique_ptr<A>> v;
v.emplace_BACk(make_unique<B>());

现在很明显,v拥有对象,但是我仍然不喜欢那个选择的对象有一个原始的指针,使我的设计不直观.查看标准C库我认为只有一种类型可以做这个工作std::reference_wrapper

std::vector<std::unique_ptr<A>> v;
v.emplace_BACk(make_unique<B>());

// temporary container for some operation
std::vector<std::reference_wrapper<A>> SELEcted;
if(check())
  SELEcted.emplace_BACk(*v.front());

你对这段代码感觉如何?这是一个很好的做法吗?我知道std :: ref()和std :: cref意在主要使用模板,但似乎在这里我们也可以使用它来清楚地说明我们的设计意图.我唯一遇到的问题是,我必须使用get()取消引用std :: reference_wrapper,并且没有操作符*()或operator->()在内部具有相同的界面,就像在具有unique_ptr的容器中一样.我应该自己写类似的东西吗?或者可能在以后的C版本中可以扩展一个reference_wrapper用于这种用例?请分享您的反馈意见.

编辑:我改变了代码示例,可能更好地展示了意图.

解决方法

您已经提供了一个看起来很好的解决方案.我明白问题是“你好吗?

我的个人感觉是,一方面需要在安全性和明确性之间存在一定的平衡,另一方面在代码的简单性方面存在一些平衡.看起来你的解决方案可能会推动它太难于安全,并且使简单性太多了.每当我使用容纳“弱引用”的容器时,我使用原始指针来表示这些.的确,这可能会使对象的拥有者不太清楚,但是它也有一些优点:你不必研究一个“reference_wrapper”是什么,代码是清楚的.如果您仅使用它们(弱引用的容器),并且封装了此用法,那么所有权问题应该是最小的.

但这只是个人喜好的问题,我猜.让我只是提出使用不同类型的同一目的.这是提供您可以负担使用Boost.对于“强”参(拥有资源),您可以使用Steve Watanabe的Type Erasure库.它不需要明确使用自由存储内存,我想对于小型类型,它可以摆脱使用堆内存(使用小缓冲区优化). Boost最近被接受了,然还没有发布,我想.

对于弱引用,请虑使用Boost.optional的“可选引用”:

int i = 0;
boost::optional<int&> oi = i; // note: int&
i = 2;
assert(*oi == 2);

它具有与reference_wrapper相同的语义.

大佬总结

以上是大佬教程为你收集整理的c – std :: reference_wrapper在容器中的用法全部内容,希望文章能够帮你解决c – std :: reference_wrapper在容器中的用法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。