名前空間
変種
操作

std::reference_wrapper

提供: cppreference.com
< cpp‎ | utility‎ | functional
 
 
 
関数オブジェクト
関数ラッパー
(C++11)
(C++11)
バインド
(C++11)
関数呼び出し
(C++17)
恒等関数オブジェクト
(C++20)
参照ラッパー
reference_wrapper
(C++11)
(C++11)(C++11)
演算子ラッパー
否定子
(C++17)
検索子
古いバインダとアダプタ
(C++17以前)
(C++17以前)
(C++17以前)
(C++17以前)
(C++17以前)(C++17以前)(C++17以前)(C++17以前)
(C++20以前)
(C++20以前)
(C++17以前)(C++17以前)
(C++17以前)(C++17以前)

(C++17以前)
(C++17以前)(C++17以前)(C++17以前)(C++17以前)
(C++20以前)
(C++20以前)
 
 
ヘッダ <functional> で定義
template< class T >
class reference_wrapper;
(C++11およびそれ以降)

std::reference_wrapper はコピー可能、代入可能なオブジェクトに参照をラップするクラステンプレートです。 通常は参照を保持できない標準コンテナ (std::vector のような) の内部に参照を格納するための仕組みとしてよく使用されます。

具体的には、 std::reference_wrapperT 型のオブジェクトへの参照または関数への参照を中心とする CopyConstructible かつ CopyAssignable なラッパーです。 std::reference_wrapper のインスタンスはオブジェクト (コピーしたりコンテナに格納したりできる) ですが、ベースとなる型を参照で取る関数で引数として使用できるように、 T& に暗黙に変換されます。

格納されている参照が Callable である場合、 std::reference_wrapper はそれと同じ引数で呼び出し可能です。

ヘルパー関数 std::ref および std::crefstd::reference_wrapper オブジェクトを生成するためによく使用されます。

std::reference_wrapperstd::bindstd::thread のコンストラクタにオブジェクトを参照渡しするためにも使用されます。

std::reference_wrapperTriviallyCopyable であることが保証されます。

(C++17およびそれ以降)

目次

[編集] メンバ型

定義
type T
result_type(C++17で非推奨)(C++20で削除) T が関数であれば T の戻り値の型。 そうでなければ定義されません
argument_type(C++17で非推奨)(C++20で削除) 1) TA1 型の引数をひとつ取る関数または関数ポインタの場合、 argument_typeA1 です

2) T がクラス T0 の引数を取らないメンバ関数ポインタの場合、 argument_typeT0* です (cv 修飾されるかもしれません)
3) T がメンバ型 T::argument_type を持つクラス型の場合、 argument_type はそのエイリアスです

first_argument_type(C++17で非推奨)(C++20で削除) 1) T が型 A1 および A2 の2つの引数を取る関数または関数ポインタの場合、 first_argument_typeA1 です

2) T がクラス T0 の引数をひとつ取るメンバ関数ポインタの場合、 first_argument_typeT0* です (cv 修飾されるかもしれません)
3) T がメンバ型 T::first_argument_type を持つクラス型の場合、 first_argument_type はそのエイリアスです

second_argument_type(C++17で非推奨)(C++20で削除) 1) T が型 A1 および A2 の2つの引数を取る関数または関数ポインタの場合、 second_argument_typeA2 です

2) T がクラス T0A1 引数をひとつ取るメンバ関数ポインタの場合、 second_argument_typeA1 です (cv 修飾されるかもしれません)
3) T がメンバ型 T::second_argument_type を持つクラス型の場合、 second_argument_type はそのエイリアスです

[編集] メンバ関数

新しい std::reference_wrapper オブジェクトに参照を格納します
(パブリックメンバ関数) [edit]
std::reference_wrapper を再束縛します
(パブリックメンバ関数) [edit]
格納されている参照にアクセスします
(パブリックメンバ関数) [edit]
格納されている関数を呼びます
(パブリックメンバ関数) [edit]

[編集] 推定ガイド(C++17およびそれ以降)

[編集] 実装例

template <class T>
class reference_wrapper {
public:
  // types
  typedef T type;
 
  // construct/copy/destroy
  reference_wrapper(T& ref) noexcept : _ptr(std::addressof(ref)) {}
  reference_wrapper(T&&) = delete;
  reference_wrapper(const reference_wrapper&) noexcept = default;
 
  // assignment
  reference_wrapper& operator=(const reference_wrapper& x) noexcept = default;
 
  // access
  operator T& () const noexcept { return *_ptr; }
  T& get() const noexcept { return *_ptr; }
 
  template< class... ArgTypes >
  std::invoke_result_t<T&, ArgTypes...>
    operator() ( ArgTypes&&... args ) const {
    return std::invoke(get(), std::forward<ArgTypes>(args)...);
  }
 
private:
  T* _ptr;
};
 
// deduction guides
template<class T>
reference_wrapper(reference_wrapper<T>) -> reference_wrapper<T>;

[編集]

参照のコンテナとしての reference_wrapper の使用をデモンストレーションします。 これにより複数のインデックスを使用して同じコンテナにアクセスすることが可能となります。

#include <algorithm>
#include <list>
#include <vector>
#include <iostream>
#include <numeric>
#include <random>
#include <functional>
 
int main()
{
    std::list<int> l(10);
 
    std::iota(l.begin(), l.end(), -4);
    std::vector<std::reference_wrapper<int>> v(l.begin(), l.end());
 
    // can't use shuffle on a list (requires random access), but can use it on a vector
    std::shuffle(v.begin(), v.end(), std::mt19937{std::random_device{}()});
 
    std::cout << "Contents of the list: ";
    for (int n : l){ 
        std::cout << n << ' ';
    }
 
    std::cout << "\nContents of the list, as seen through a shuffled vector: ";
    for (int i : v){
        std::cout << i << ' ';
    }
 
    std::cout << "\n\nDoubling the values in the initial list...\n\n";
    for (int& i : l) {
        i *= 2;
    }
 
    std::cout << "Contents of the list, as seen through a shuffled vector: ";
    for (int i : v){
       std::cout << i << ' ';
    }
}

出力例:

Contents of the list: -4 -3 -2 -1 0 1 2 3 4 5 
Contents of the list, as seen through a shuffled vector: -1 2 -2 1 5 0 3 -3 -4 4 
Doubling the values in the initial list...
Contents of the list, as seen through a shuffled vector: -2 4 -4 2 10 0 6 -6 -8 8

[編集] 関連項目

(C++11)(C++11)
引数から推定される型の std::reference_wrapper を作成します
(関数テンプレート) [edit]
(C++11)
関数オブジェクトに1つ以上の引数をバインドします
(関数テンプレート) [edit]