问题标签 [reference-wrapper]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
318 浏览

c++ - 使用 reference_wrapper 作为 condition_variable 谓词

注意:以下内容同样适用于 Boost.Thread 和 C++11 线程。

我有一个条件变量,它实际上是一个简单的布尔变量。

我想使用wait(lock, predicate)语法。例如,我可以使用 lambda:

但我认为应该有一种更惯用的方式将变量包装为可调用对象。所以我发现reference_wrapper提供了一个operator()检索包装值的方法。因此我尝试了:

但是g++ (4.9.1) 不编译它,争论no matching function for call to '(boost::reference_wrapper<const bool>) ()'(如果我使用std::ref错误有些不同,但仍然不编译)。

不应该有reference_wrapper资格作为条件变量的适当谓词吗?如果不是,为什么?在这种情况下,什么是正确的包装器b

编辑:所以@Praetorian 已经非常正确地解释了我的错误,但是,在 Boost 或标准上真的没有这样的东西(这里可能有错误):

0 投票
2 回答
326 浏览

c++ - 如何为 reference_wrapper 的 STL 容器设置初始大小?

我有一个vector包含在reference_wrapper. 由于我需要乱序填充此容器,因此我正在尝试为容器设置初始大小:

这无法编译,并出现如下错误:

是否有解决方法来完成这项工作,或者我必须vector<T*>为此目的使用 a 吗?

0 投票
4 回答
49138 浏览

c++ - std::reference_wrapper 和简单指针之间的区别?

为什么需要有std::reference_wrapper?应该在哪里使用?它与简单的指针有何不同?它的性能与简单指针相比如何?

0 投票
1 回答
4276 浏览

c++ - 在 std::map 中使用 std::reference_wrapper

我认为 maps 和 reference_wrappers 会很容易,但我绊倒了一些奇怪的东西:

这段代码给了我以下编译器错误:

我是否在做一些我应该意识到的非常非常愚蠢的事情?为什么这段小代码不能直接工作?

0 投票
1 回答
154 浏览

c++ - 我的 bad_alloc 来自哪里?

我有这个代码。scoresHiscoreTable类型 的字段std::vector<reference_wrapper<Record>>

如果我尝试这样做for(reference_wrapper<Record> r : scores) cout << r.get() << endl;,则会抛出一个 bad_alloc。是不是因为ris not a Record&but areference_wrapper<Record>所以我不能给Record它分配 a ?我以为reference_wrapper<Record>::operator=是超载允许这样的事情?

编辑:原来这是我的析构函数中的一个问题,打印循环所在的位置。在某些时候,我通过值将 HiscoreTable 传递给辅助函数,当它在辅助函数结束时被破坏时,它使调用站点的 HiscoreTable 无效。我不知道为什么打印会破坏参考,但我想这就是发生的事情。

0 投票
1 回答
307 浏览

c++ - MS Visual Studio 2013 上的 std::reference_wrapper

我尝试编译一些与以下代码非常相似的代码:

但无法弄清楚,为什么它不编译。我很确定,相同的代码在 MS Visual Studio 2012 上编译良好 - 但在 Visual Studio 2013 上,它报告以下编译错误:

我试图在我的班级中添加复制、移动、赋值运算符 - 但无法摆脱这个错误。我怎样才能准确地找出这个错误指的是哪个已删除的函数?

0 投票
2 回答
1541 浏览

c++ - std::reference_wrapper 的问题

使用以下代码可以清楚地解决问题:

如果我使用注释std::vector<int> a, b;而不是int a = 0, b = 0;,则代码不会在任何 GCC 5.1、clang 3.6 或 MSVC'13 上编译。在我看来,std::reference_wrapper<std::vector<int>>可以隐式转换std::vector<int>&为 LessThanComparable,因此它本身应该是 LessThanComparable。有人可以向我解释一下吗?

0 投票
1 回答
437 浏览

c++ - 为什么标准容器使用函数模板而不是非模板 Koenig 运算符

这个问题的灵感来自于 std::reference_wrapper的问题。比如说,operator<对于std::vector。它被定义为一个函数模板

结果,函数参数到相应函数参数类型的隐式转换被拒绝(主要是因为它的模板性质)。这大大降低了std::reference_wrapper. 例如,您不能使用std::sorton std::vector<std::reference_wrapper<std::vector<int>>>

另一方面,只有当operator<定义为非模板 Koenig 算子时,所有问题都得到解决,例如

我想知道为什么标准库采用了前一种方法而不是这种方法?

0 投票
1 回答
402 浏览

serialization - reference_wrapper 到 boost 中的抽象类序列化

我必须在抽象类的 Boost 向量(或任何其他容器)中进行序列化。因为无法直接创建抽象类的向量,所以我为这个抽象类创建了reference_wrapper的向量。

但是如何在 Boost std::reference_wrapper 中序列化为抽象类呢?当我尝试直接执行此操作时,出现错误,reference_wrapper 的默认构造函数不可访问。

提前致谢。

0 投票
1 回答
317 浏览

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

问题:

假设一个函数

某些类型在哪里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> >。但我不知道这是否可能,以及它是否会产生一些不好的后果。如果这个或类似的东西是可能的和安全的,我会更喜欢这个解决方案。