什么是"你好,世界!" "std :: ref"的例子?

Rom*_*man 66 c++ std ref c++11

有人可以举一个简单的例子来证明其功能std::ref吗?我的意思是一个例子,其中只有在std::ref没有它们的情况下无法解释时才使用其他一些结构(如元组或数据类型模板).

我在std::ref 这里这里找到了两个问题.但是在第一个中,它涉及编译器中的错误,而在第二个中,使用std::ref不包含的示例,std::ref它们涉及元组和数据类型模板,这使得对这些示例的理解变得复杂.

Dre*_*ann 83

您应该考虑使用std::ref函数时:

  • 按值获取模板参数
  • 或复制/移动转发引用参数,例如std::bind或者构造函数std::thread.

std::ref 是一种行为类似于引用的值类型.

这个例子可以明显地使用std::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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

0
1
Run Code Online (Sandbox Code Playgroud)

  • 值得指出的是,`std :: ref`是可重新绑定的,与传统的引用不同,如果你将一个引用到模板函数中,这可能很重要.有关示例,请参见http://stackoverflow.com/questions/37101301/is-this-stdref-behaviour-logical. (4认同)

sba*_*bbi 16

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
Run Code Online (Sandbox Code Playgroud)

std::ref主要用于在使用时封装引用std::bind(当然也可以使用其他用法).


bd2*_*357 8

您可能需要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; }
Run Code Online (Sandbox Code Playgroud)

您希望各种线程中运行的各种函数共享一个缓冲区对象.这个例子是从这个优秀的教程(C++ 11并发教程 - 第3部分:高级锁定和条件变量(Baptiste Wicht) )中窃取的(希望我正确地做了归因)