1. ホーム
  2. c++

std::ref」の「Hello, World!」な例は?

2023-09-05 14:36:55

質問

の機能を示す簡単な例をどなたか教えてください。 std::ref ? 私が言いたいのは、他の構成要素(タプルやデータ型テンプレートのような)が使われている例です。 の場合のみです。 を説明するのは不可能です。 std::ref を説明することができない場合のみです。

に関する2つの質問を見つけました。 std::ref ここで そして はこちら . しかし、最初のものではコンパイラのバグについて、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