モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

C++11 ラムダ式の簡単な使い方

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

公開日公開日
2019/09/02
最終更新最終更新
2022/01/07
記事区分記事区分
一般公開

目次

    GitHub Actions とか CI/CD が好きです。

    0
    ステッカーを贈るとは?

    C++11 で導入されたラムダ式について簡単なサンプルコードを記載します。

    ラムダ式の構文

    以下のように記述します。

    #include <iostream>
    int main() {
        auto f = [](std::string mystr){ std::cout << mystr << std::endl;};
        f("Hello World");
        return 0;
    }
    
    • [] 後述のキャプチャリストです。
    • () 引数がない場合は省略できます。
    • {} 関数の本体です。

    関数の外の変数をキャプチャして使用

    値を書き換える場合。

    #include <iostream>
    int main() {
    
        int x = 1;
    
        // 参照キャプチャ
        auto f = [&] { x = 2; };
        // auto f = [&x] { x = 2; }; // としてもよい。
    
        f();
        std::cout << x << std::endl; //=> 2
    
        return 0;
    }
    

    値をコピーして利用するだけの場合。

    #include <iostream>
    int main() {
    
        int x = 1;
    
        // コピーキャプチャ
        auto f = [=] { return x + 1; };
        // auto f = [x] { return x + 1; }; // としてもよい。
    
        std::cout << f() << std::endl; //=> 2
        std::cout << x << std::endl; //=> 1
    
        return 0;
    }
    

    返り値の型を明示

    返り値の型を明示的に指定できます。指定しない場合は暗黙的に推論されます。typeid で型を確認できます。

    #include <iostream>
    #include <typeinfo>
    
    int main() {
    
        auto f = []() { return 1; };
        auto g = []()->float { return 1; };
    
        const std::type_info& ti = typeid(f());
        std::cout << ti.name() << std::endl; //=> i
    
        const std::type_info& ti2 = typeid(g());
        std::cout << ti2.name() << std::endl; //=> f
    
        return 0;
    }
    

    ラムダ式を引数および返り値に取る関数

    std::function でラムダ式を引数および返り値に取る関数を定義できます。

    #include <iostream>
    #include <functional>
    
    std::function< int(int,int) > FF() {
        auto f = [](int a, int b) { return a + b; };
        return f;
    }
    
    void GG(std::function< int(int,int) > FP) {
        std::cout << FP(1, 1) << std::endl;
    }
    
    int main() {
        auto f = FF();
        GG(f); //=> 2
        return 0;
    }
    

    ラムダ式は関数ポインタにキャストすることもできます。

    #include <iostream>
    
    typedef int(*FpIII)(int,int);
    
    FpIII FF() {
        auto f = [](int a, int b) { return a + b; };
        return f;
    }
    
    void GG(FpIII FP) {
        std::cout << FP(1, 1) << std::endl;
    }
    
    int main() {
        auto f = FF();
        GG(f); //=> 2
        return 0;
    }
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    GitHub Actions とか CI/CD が好きです。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事