C++プログラミング入門番外編 – std::functionとラムダ式

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

これまでC言語及びC++の入門に関連する情報を色々書いてみたが、今回は番外編としてC++11以降特有の機能を使ってみたい。

C++11ではこれまでのC++からかなりの拡張が加えられており、std::functionやラムダ式などといった、使いこなせればかなり強力な機能が追加されている。

std::functionは関数のラッパークラスで、普通の関数、バインド式、ラムダ式、関数オブジェクトなどを格納したり、コピー、呼び出したりすることができる強力な機能である。

ここではstd::functionとラムダ式を組み合わせた例を以下に記述してみたい。

サンプルコード

[code lang=”cpp”]#include <iostream>
#include <functional>
using namespace std;

static function<void()> method = nullptr;

int main(void){
method = []() {
cout << "Hello, world" << endl;
};
method();
return 0;
}[/code]

解説

グローバル変数としてvoidを返す関数ラッパーオブジェクトであるmethodを宣言しており、main内でmethodに実際の処理をラムダ式で代入している。これにとってmethodを呼び出した時に「Hello, world」を出力するようになった。

その後、method()を呼び出すことによって「Hello, world」が出力されたという形となる。

ラムダ式とstd::functionを組み合わせで期待できる利点

ラムダ式とstd::functionを組み合わせることによって、記述は比較的シンプルだが他の関数との競合を起こす可能性のあるコールバックインターフェース ((C++では実際にはインターフェースクラスはなく、純粋仮想関数のみが宣言されたクラスがそれに近い)) を使った方法と比較しても関数の競合を防げるという利点はかなり大きい。

また、クラスのインスタンス変数としてstd::functionを定義した場合、複数の関数から呼ばれるのでないのであれば、呼び出し元からはローカル変数のプロパティーとしてラムダ式を定義することができるようになるため、記述次第ではかなりシンプルにまとまるだろう。

最後に

C++11に限らず、新たに追加された機能はどうしても抵抗を感じてしまうことがあるかもしれないが、多くの場合、利便性が向上、あるいはセキュリティー面でも望ましい場合が多いので、積極的に使っていきたいところである。

タイトルとURLをコピーしました