77

誰かがの機能を示す簡単な例を挙げてもらえますかstd::ref?他のいくつかの構造(タプルやデータ型テンプレートなど)が、それらなしでは説明できない場合にのみstd::ref使用される例を意味します。

std::ref ここここについて2つの質問を見つけました。しかし、最初の例ではコンパイラのバグについて説明し、2番目の例では、の使用例にstd::ref含まれておらずstd::ref、これらの例の理解を複雑にするタプルとデータ型テンプレートが含まれています。

4

4 に答える 4

93

std::ref関数の使用を検討する必要があります。

  • テンプレートパラメータを値で受け取ります
  • または のコンストラクターなどのテンプレート パラメーターをコピー/移動します。std::bindstd::thread

std::ref参照のように動作するコピー可能な値の型を作成します。

この例では、 を実証的に使用していstd::refます。

#include <iostream>
#include <functional>
#include <thread>

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;

  // The same applies for std::thread
  std::thread( increment, std::ref(i) ).join();
  std::cout << i << std::endl;
}

出力:

0
1
2
于 2013-03-20T17:27:11.690 に答える
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

std::ref主に使用時に参照をカプセル化するために使用されますstd::bind(ただし、もちろん他の使用も可能です)。

于 2013-03-20T17:29:25.557 に答える
9

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; }

さまざまなスレッドで実行されているさまざまな関数が単一のバッファ オブジェクトを共有するようにしたい場合。この例は、この優れたチュートリアル ( C++11 Concurrency Tutorial - Part 3: Advanced locking and condition variables (Baptiste Wicht) ) から引用したものです (帰属が正しく行われたことを願っています)。

于 2015-03-10T17:27:22.977 に答える