问题标签 [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 - 如何从 std::vector 获取 C 数组
我是 C++11 的新手,我对std::refence_wrapper
类的使用感到困惑。
让我们考虑https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper中显示的示例
,它对包含在标准中的元素进行了洗牌std::vector
,即:
现在,如果考虑原始向量l
,我会l.data()
返回一个指向内部数组的指针,我可以在 C 应用程序中使用它。
相反,我不清楚v.data()
. 我尝试了各种肯定错误的演员组合,例如int* p = (int*)(v.data()->get())
没有获得正确的结果(交换的值)。
我的目标是将 C++ 应用程序(它给了我一个引用包装器的向量)与旧的 C 库接口。v
在示例中显示的随机播放之后,您能指出从 vector 获取类 C 数组的最正确方法吗?我是否需要将所有元素一个接一个地复制到另一个向量中?是否有任何 C++11 课程可以帮助我完成这项工作?谢谢
c++ - runtime polymorphic invocation of pure virtual function via std::reference_wrapper behaving inconsistently
I present to you this code riddle:
Using this compiler:
user@bruh:~/test$ g++ --version
g++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
...and this compile string:
g++ main.cpp class.cpp -o main -g
...and these files:
class.hpp:
class.cpp:
main.cpp:
...I get the following output:
My questions:
Why does this not segfault when the user supplied argument = 1?
Why does this segfault when the user supplied argument > 1?
My short explanation of what the code does:
Creates many objects derived from an abstract base class. Stores references to the objects in containers as std::reference_wrapper around abstract base class reference. Creates the containers of std::reference_wrapper slightly differently. Calls the derived override of pure virtual function via the std::reference_wrappers. Segfaults specifically in the case denoted in the source code above.
I implore the C++ experts... Please help me! This is fascinating and I have no idea why it is happening! I've probably done something dumb.
c++ - 对 std::reference_wrapper 的大小有任何保证吗?
考虑我有足够的存储空间来托管 avoid *
并因此就地构造指针的情况。
是否可以保证相同的存储空间足够大以始终存储一个std::reference_wrapper
?
有点(写在我的脑海里,只是为了理解我的意思):
从快速而肮脏的测试中,我发现在我的机器上这是有效的,即 a 的大小std::reference_wrapper
与 a 的大小相匹配void *
。但是,在不同的平台上可能会出现这种情况。同时,我在标准中找不到任何关于 and 大小的线索,std::reference_wrapper
我想知道它是否定义了实现或有任何保证。
为了给出上下文,我正在开发一个围绕不同类型(类似于std::any
)的不透明包装器,它执行小对象优化以尽可能避免分配。
当我收到一个std::reference_wrapper
时,我想使用不同的路径来sizeof(T) > sizeof(void *)
区分周围的其他情况。但是,我不知道我是否可以在包装器中复制构造,或者在这种情况下我是否也应该依赖分配。
c++ - 使用 reference_wrappers 初始化向量
我正在尝试使用引用包装器的向量运行一个示例,但在向量变量声明时遇到编译错误。这是代码:
std::initializer_list
带有存在的向量构造函数。传递的值的类型必须是const T
,std::cref
返回,为什么会报错:
? (如果重要,使用 gcc -std=c++17 构建)
c++ - 在本地使用 reference_wrapper 初始化向量
我有许多我想从标准容器中使用的继承相关类型(std::reference_wrapper
对于这种容器来说,AFAIU 是一个合适的值类型)。但是,我不明白,当插入到映射中的引用值不是全局变量时,如何初始化这样的容器。例如:
这可以编译,但我在运行时会出现一些内存损坏。初始化容器的正确方法是std::reference_wrapper
什么?
c++ - 带有引用包装器的 STL 库的 const 正确性?
我有以下课程:
现在想象一下,我需要保留的不是一个,而是多个 Data 实例。我将它们保存在引用包装器的向量中,但我也想保持 const 的正确性:在 const 上下文中将数据作为不可修改的形式传递。
如何在没有物理复制数据的情况下实现这一点?即,我不想按值返回向量的副本,也不想在 A 类中保留两个单独的向量。对于基本上只是语义问题的问题,两者都是影响性能的解决方案。
c++ - std::find 在 std::vector 上失败> 当 T 在命名空间中时出现“与 'operator==' 不匹配”错误
我目前正在从事一个大型代码项目,并想借此机会了解和使用命名空间。我定义的所有类都驻留在一个命名空间Test 中。
我的其中一个类(此处称为 Thing)具有唯一 ID。我需要能够保存对某些事物的引用的 std::vector,因此我正在使用 std::reference_wrappers。在程序中,我需要从向量中删除某些 std::reference_wrappers,所以我使用 std::find:
当我尝试编译它时,我收到一个错误:
但是,如果我删除命名空间,代码会正确编译:
c++ - 处理 std::reference_wrapper 的最佳方法作为 std::reference_wrapper
我有两个类,说' Base
'和' Derived
',其中Derived
类继承Base
类。
然后是对派生类实例 ( std::vector< std::reference_wrapper< Derived > > myContainer
) 的引用容器。
最后,我有一个std::vector< std::reference_wrapper< Base > >
作为参数的函数。
如果我将容器(myContainer)传递给函数,它不会编译:
如果我改变我的容器来保存对 Base 的引用,一切都会正常工作,因为它是一个 reference_wrapper,我相信,我仍然会有我需要的多态行为。但这感觉不干净,因为我确信我的容器不会容纳除派生实例之外的任何东西。
同时,接受向量的函数应该适用于 Derived 和 Base 类。
最小代码:
实时代码:https ://godbolt.org/z/SX5Gag
要求函数将派生引用的容器视为基本引用的向量的最佳方法是什么?
c++ - reference_wrapper 的下标运算符
我最近了解到,std::reference_wrapper<T>
函数调用运算符有一个重载,以防T
类似函数。我想知道标准委员会是否有理由在我们捕获类似std::vector
. 在我看来,这个标准类中只有一个只能作为类成员重载的典型运算符中的一个。
这背后的原因是什么?
c++ - std 变体和前向声明
我的理解是std::variant
不能直接保存引用。
但是,std::reference_wrapper
是一种完全限定的类型,可以放入诸如 之类的东西std::vector
中,并且由于可以制作引用包装器的向量,我想人们可以对std::variant
.
以下(编辑得更简洁)代码在 gcc 中生成了大量错误:
CRef
模板只是 std::reference_wrapper 到 const 引用的方便包装器,模板的Contains
存在是为了帮助类了解基类在某些时候可能引用的所有端点子类。在上述情况下,我只是想要一个getSize()
方法,它将返回变量中包含的实际类型的大小。 Baz
,在这种情况下,是唯一的端点类,尽管实际上会有更多,并且它们没有公共基类,这就是为什么我需要一个变体,并且不能简单地使用基类并使用虚函数。
编译器生成的错误在这里可见:https ://godbolt.org/z/lcbPjB
所以,我想我可能正在做一些不允许的事情。
我的问题是,有没有办法做我正在尝试的事情?如果我的意图不清楚,我会提前道歉。如果在理解我要达到的目标时遇到问题,可以留下一些反馈,具体确定我需要提供哪些额外信息,我将努力遵守。
请记住,在实际用例中,端点类要复杂得多,并且除了 getSize() 之外还会有更多的函数,但我希望一旦我有一些适用于这个简单案例的东西,我应该能够概括和正确实现其他功能。