什么是“你好,世界!”例如“std :: ref”?
有人可以给一个简单的例子,演示std::ref
的function? 我的意思是一个例子,其中一些其他的构造(如元组或数据types模板) 只有在不能解释std::ref
时才被使用。
我在这里和这里发现了两个关于std::ref
问题。 但是第一个是关于编译器的错误,第二个是使用std::ref
例子不包含std::ref
,它们涉及元组和数据types模板,这使得对这些例子的理解变得复杂。
你应该考虑在函数中使用std::ref
:
- 通过值获取模板参数
- 或复制/移动转发引用参数 ,如
std::bind
或std::thread
的构造函数。
std::ref
是一个类似于引用的值types。
这个例子可以certificatestd::ref
。
#include <iostream> #include <functional> void increment( int &x ) { ++x; } int main() { int i = 0; // Here, we bind increment to (a copy of) i... std::bind( increment, i ) (); // ^^ (...and invoke the resulting function object) // i is still 0, because the copy was incremented. std::cout << i << std::endl; // Now, we bind increment to std::ref(i) std::bind( increment, std::ref(i) ) (); // i has now been incremented. std::cout << i << std::endl; }
输出:
0 1
void PrintNumber(int i) {...} int n = 4; std::function<void()> print1 = std::bind(&PrintNumber, n); std::function<void()> print2 = std::bind(&PrintNumber, std::ref(n)); n = 5; print1(); //prints 4 print2(); //prints 5
std::ref
主要用于在使用std::bind
时封装引用(当然也可以使用其他的用途)。
你可能需要std :: ref的另一个地方是将对象传递给你希望每个线程在单个对象上运行的线程,而不是对象的副本。
int main(){ BoundedBuffer buffer(200); std::thread c1(consumer, 0, std::ref(buffer)); std::thread c2(consumer, 1, std::ref(buffer)); std::thread c3(consumer, 2, std::ref(buffer)); std::thread p1(producer, 0, std::ref(buffer)); std::thread p2(producer, 1, std::ref(buffer)); c1.join(); c2.join(); c3.join(); p1.join(); p2.join(); return 0; }
您希望在各个线程中运行的各种function共享单个缓冲区对象。 这个例子是从这个优秀的教程( C ++ 11并发教程 – 第3部分:高级locking和条件variables(Baptiste Wicht) )中被盗取的(希望我正确地做了归因)