最終更新日時:
が更新

履歴 編集

function template
<utility>

std::exchange(C++14)

namespace std {
  template <class T, class U=T>
  T exchange(T& obj, U&& new_val);
}

概要

値を書き換え、書き換え前の値を返す。

効果

第1パラメータobjで受け取った変数への参照に、第2パラメータnew_valの値をムーブ代入し、代入前のobjの状態を返す。

以下と同等の効果を持つ:

T old_val = std::move(obj);
obj = std::forward<U>(new_val);
return old_val;

戻り値

この関数を呼び出す前の、第1パラメータobjの状態を返す。

備考

この関数は、std::atomic_exchange()関数の経験から導入された。

#include <iostream>
#include <utility>

int main()
{
  int state = 1;
  int before = std::exchange(state, 2);

  std::cout << "state : " << state << std::endl;
  std::cout << "before : " << before << std::endl;
}

出力

state : 2
before : 1

コンテナを出力する例

#include <iostream>
#include <utility>
#include <vector>

template <class T>
void print(const std::vector<T>& v)
{
  // カンマ区切りでvectorを出力する。
  // 区切り文字は、各要素の後ではなく、前に置くと考える。
  // 最初の要素のみ区切り文字を出力しない。

  bool first = true;

  std::cout << '{';
  for (const T& x : v) {
    if (!std::exchange(first, false)) {
      std::cout << ',';
    }
    std::cout << x;
  }
  std::cout << '}';
}

int main()
{
  const std::vector<int> v = {1, 2, 3};
  print(v);
}

出力

{1,2,3}

バージョン

言語

  • C++14

処理系

参照