问题标签 [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.
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 或标准上真的没有这样的东西(这里可能有错误):
c++ - 如何为 reference_wrapper 的 STL 容器设置初始大小?
我有一个vector
包含在reference_wrapper
. 由于我需要乱序填充此容器,因此我正在尝试为容器设置初始大小:
这无法编译,并出现如下错误:
是否有解决方法来完成这项工作,或者我必须vector<T*>
为此目的使用 a 吗?
c++ - std::reference_wrapper 和简单指针之间的区别?
为什么需要有std::reference_wrapper
?应该在哪里使用?它与简单的指针有何不同?它的性能与简单指针相比如何?
c++ - 在 std::map 中使用 std::reference_wrapper
我认为 maps 和 reference_wrappers 会很容易,但我绊倒了一些奇怪的东西:
这段代码给了我以下编译器错误:
我是否在做一些我应该意识到的非常非常愚蠢的事情?为什么这段小代码不能直接工作?
c++ - 我的 bad_alloc 来自哪里?
我有这个代码。scores
是HiscoreTable
类型 的字段std::vector<reference_wrapper<Record>>
如果我尝试这样做for(reference_wrapper<Record> r : scores) cout << r.get() << endl;
,则会抛出一个 bad_alloc。是不是因为r
is not a Record&
but areference_wrapper<Record>
所以我不能给Record
它分配 a ?我以为reference_wrapper<Record>::operator=
是超载允许这样的事情?
编辑:原来这是我的析构函数中的一个问题,打印循环所在的位置。在某些时候,我通过值将 HiscoreTable 传递给辅助函数,当它在辅助函数结束时被破坏时,它使调用站点的 HiscoreTable 无效。我不知道为什么打印会破坏参考,但我想这就是发生的事情。
c++ - MS Visual Studio 2013 上的 std::reference_wrapper
我尝试编译一些与以下代码非常相似的代码:
但无法弄清楚,为什么它不编译。我很确定,相同的代码在 MS Visual Studio 2012 上编译良好 - 但在 Visual Studio 2013 上,它报告以下编译错误:
我试图在我的班级中添加复制、移动、赋值运算符 - 但无法摆脱这个错误。我怎样才能准确地找出这个错误指的是哪个已删除的函数?
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。有人可以向我解释一下吗?
c++ - 为什么标准容器使用函数模板而不是非模板 Koenig 运算符
这个问题的灵感来自于 std::reference_wrapper的问题。比如说,operator<
对于std::vector
。它被定义为一个函数模板
结果,函数参数到相应函数参数类型的隐式转换被拒绝(主要是因为它的模板性质)。这大大降低了std::reference_wrapper
. 例如,您不能使用std::sort
on std::vector<std::reference_wrapper<std::vector<int>>>
。
另一方面,只有当operator<
定义为非模板 Koenig 算子时,所有问题都得到解决,例如
我想知道为什么标准库采用了前一种方法而不是这种方法?
serialization - reference_wrapper 到 boost 中的抽象类序列化
我必须在抽象类的 Boost 向量(或任何其他容器)中进行序列化。因为无法直接创建抽象类的向量,所以我为这个抽象类创建了reference_wrapper的向量。
但是如何在 Boost std::reference_wrapper 中序列化为抽象类呢?当我尝试直接执行此操作时,出现错误,reference_wrapper 的默认构造函数不可访问。
提前致谢。
c++ - 我应该如何将容器转换为 reference_wrappers 的容器?
问题:
假设一个函数
某些类型在哪里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> >
。但我不知道这是否可能,以及它是否会产生一些不好的后果。如果这个或类似的东西是可能的和安全的,我会更喜欢这个解决方案。