[解決済み] std::functionの使用法と構文
質問
を使用する必要があります。
std::function
が、以下の構文の意味がわかりません。
std::function<void()> f_name = []() { FNAME(); };
を使う目的は何ですか?
std::function
? 関数へのポインタを作るため?
どのように解決するのですか?
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()
また、return typeは戻り値の型である。 ラムダインスタンスのコンストラクタも、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)、cast-back-to-original-type操作が含まれる。
関連
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] const std::string & をパラメータとして渡す時代は終わったのでしょうか?
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較