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

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

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

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

モーダルを閉じる

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

お支払い手続きへ
モーダルを閉じる

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

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

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

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

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

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

作成日作成日
2019/09/02
最終更新最終更新
2021/12/07
記事区分記事区分
一般公開

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;
}
Likeボタン(off)0
詳細設定を開く/閉じる
アカウント プロフィール画像

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

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

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

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

Feedbacks

Feedbacks コンセプト画像

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

    ログインする

    関連記事