#機能
C++に存在する複数の種類の関数をラップして同じように扱う
C++にある関数の種類
- 関数
- ラムダ式
- 関数オブジェクト
- クラスのメンバ関数
##ラムダ式の使い方
[キャプチャー](引数)->返り値の型{関数の内容}(実行時の引数);
キャプチャーには基本的に[=]か[&]が入る
=はスコープ外の変数を利用する時コピーするという意味
&はスコープ外の変数を利用する時参照するという意味
[]{}();のように引数や返り値を省略することもできる
#使い方
std::function< 戻り値の方(引数の型) > object = 関数or ラムダ式 or 関数オブイェクト orクラスのメンバ関数;
object(引数);で利用できる
#サンプル
/*
* std_function1.cpp
* Copyright (C) 2014 kaoru <kaoru@bsd>
*/
#include <iostream>
#include <functional>
using namespace std;
struct Foo {
Foo(const int n) : i_(n) {}
void print_add(const int n) const { std::cout << i_ + n<< std::endl; }
int i_;
};
struct PrintFunctor {
// 引数を表示するだけの関数オブジェクト
void operator()(int i) {
std::cout << i << std::endl;
}
};
void
print_number(const int i)
{
std::cout << i << std::endl;
}
int
main(int argc, char const* argv[])
{
// 普通の関数
std::function< void(int) > f_func = print_number;
f_func(3);
// ラムダ式
std::function< void(int) > f_lambda = [=](int i) { print_number(i); };
f_lambda(6);
// バインド
std::function< void() > f_bind = std::bind(print_number, 9);
f_bind();
// クラスのメンバ関数
std::function< void(const Foo&, int) > f_member = &Foo::print_add;
Foo foo (1);
f_member(foo, 3); // 1+3 = 4
// 関数オブジェクト
std::function< void(int) > f_func_obj = PrintFunctor();
f_func_obj(11);
return 0;
}