C++11 ラムダ式の簡単な使い方
[履歴] [最終更新] (2019/09/02 01:19:51)
最近の投稿
注目の記事

概要

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;
}
関連ページ
    概要 C++ を Python から利用する方法の一つに pybind11 があります。C++11 をサポートするコンパイラが必要です。サンプルコードを記載します。 pybind11 — Seamless operability between C++11 and Python Reference 簡単なサンプル