std::function
型消去オブジェクトです。つまり、一部の操作がどのように発生するかの詳細が消去され、それらの操作に統一された実行時インターフェイスが提供されます。のために std::function
, 、 プライマリー1 操作はコピー/移動、破棄、および「呼び出し」です。 operator()
-- 「呼び出し演算子のような関数」。
それほど難解でない英語では、次のことを意味します std::function
呼び出し方法で関数ポインタのように機能するほぼすべてのオブジェクトを含めることができます。
サポートする署名は山かっこ内に記述されます。 std::function<void()>
引数は取らず、何も返しません。 std::function< double( int, int ) >
2つかかります int
引数と戻り値 double
. 。一般的に、 std::function
は、引数を引数リストから変換でき、戻り値を戻り値に変換できる関数のようなオブジェクトの格納をサポートします。
それを知っておくことが重要です std::function
ラムダは、互換性があるとしても、獣とは異なります。
行の次の部分はラムダです。これは、単純な関数のようなオブジェクト、つまり次のコマンドで呼び出すことができるオブジェクトを作成する機能を追加する C++11 の新しい構文です。 ()
. 。このようなオブジェクトはタイプ消去して、 std::function
ただし、実行時のオーバーヘッドが多少発生します。
[](){ code }
特に、非常に単純なラムダです。これは次のように対応します。
struct some_anonymous_type {
some_anonymous_type() {}
void operator()const{
code
}
};
上記の単純な疑似関数タイプのインスタンス。上記のような実際のクラスは、実装定義の一意の名前 (多くの場合、ユーザー定義型に含めることができないシンボルを含む) を付けてコンパイラーによって「発明」されます (発明せずに標準に従うことが可能かどうかはわかりません)このようなクラスですが、私が知っているすべてのコンパイラは実際にクラスを作成します)。
完全なラムダ構文は次のようになります。
[ capture_list ]( argument_list )
-> return_type optional_mutable
{
code
}
ただし、多くの部分は省略したり空のままにすることができます。Capture_list は、結果として得られる匿名型のコンストラクターとそのメンバー変数の両方に対応し、argument_list はその引数に対応します。 operator()
, 、戻り値の型は戻り値の型です。lambda インスタンスのコンストラクターは、capture_list を使用してインスタンスが作成されるときにも魔法のように呼び出されます。
[ capture_list ]( argument_list ) -> return_type { code }
基本的にはなる
struct some_anonymous_type {
// capture_list turned into member variables
some_anonymous_type( /* capture_list turned into arguments */ ):
/* member variables initialized */
{}
return_type operator()( argument_list ) const {
code
}
};
に注意してください c++20 テンプレート引数がラムダに追加されましたが、これについては上では説明していません。
[]<typename T>( std::vector<T> const& v ) { return v.size(); }
1 さらに、RTTI が保存され (typeid)、元の型へのキャストバック操作が含まれます。