誰かがの機能を示す簡単な例を挙げてもらえますかstd::ref
?他のいくつかの構造(タプルやデータ型テンプレートなど)が、それらなしでは説明できない場合にのみstd::ref
使用される例を意味します。
std::ref
こことここについて2つの質問を見つけました。しかし、最初の例ではコンパイラのバグについて説明し、2番目の例では、の使用例にstd::ref
含まれておらずstd::ref
、これらの例の理解を複雑にするタプルとデータ型テンプレートが含まれています。
std::ref
関数の使用を検討する必要があります。
std::bind
std::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
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; }
さまざまなスレッドで実行されているさまざまな関数が単一のバッファ オブジェクトを共有するようにしたい場合。この例は、この優れたチュートリアル ( C++11 Concurrency Tutorial - Part 3: Advanced locking and condition variables (Baptiste Wicht) ) から引用したものです (帰属が正しく行われたことを願っています)。