「関数オブジェクト」の版間の差分
提供: C++入門
行179: | 行179: | ||
* [[C++言語解説]] | * [[C++言語解説]] | ||
+ | * [[std::for_each]] | ||
+ | * [[std::vector]] |
2013年3月23日 (土) 13:41時点における版
プログラミング言語の関数オブジェクト(function object)は、関数をオブジェクトにしたものです。
読み方
- 関数オブジェクト
- かんすう おぶじぇくと
- function object
- ふぁんくしょん おぶじぇくと
目次
概要
()演算子をオーバーロードしたものを関数オブジェクト(ファンクタ)と呼びます。 関数オブジェクトは、
operator()()
と表します。
関数オブジェクトを作ってみる例
ソースコード function_object_0.cpp
引数をただ表示するだけの関数オブジェクトの例です。
呼び出し方は、
PrintFunctor()(引数);
となります。
#include <iostream> // std::cout, std::endl #include <vector> // std::vector struct PrintFunctor { // 引数を表示するだけの関数オブジェクト void operator()(int i) { std::cout << i << std::endl; } }; int main(int argc, char const* argv[]) { PrintFunctor()(1); PrintFunctor()(2); PrintFunctor()(3); return 0; }
コンパイル
g++ function_object_0.cpp -o function_object_0
実行例
% ./function_object_0 2 3 4 5
簡単な関数オブジェクトの例
ソースコード function_object_1.cpp
#include <iostream> // std::cout, std::endl #include <vector> // std::vector #include <algorithm> // std::for_each struct IncrementFunctor { // インクリメントするだけの関数オブジェクト void operator()(int& i) { ++i; } }; struct PrintFunctor { // 引数を表示するだけの関数オブジェクト void operator()(int& i) { std::cout << i << std::endl; } }; int main(int argc, char const* argv[]) { std::vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); std::for_each(v.begin(), v.end(), IncrementFunctor() ); std::for_each(v.begin(), v.end(), PrintFunctor() ); return 0; }
コンパイル
g++ function_object_1.cpp -o function_object_1
実行例
% ./function_object_1 2 3 4 5
関数オブジェクトを用いてstd::vectorを初期化する例
ソースコード function_object_2.cpp
#include <iostream> // std::cout, std::endl #include <vector> // std::vector #include <algorithm> // std::for_each struct InitFunctor { void operator()(int& i) { i = m_counter++; } InitFunctor(int counter = 0) : m_counter(counter) {} private: int m_counter; }; struct PrintFunctor { // 引数を表示するだけの関数オブジェクト void operator()(int& i) { std::cout << i << std::endl; } }; int main(int argc, char const* argv[]) { std::vector<int> v( 5 ); std::for_each(v.begin(), v.end(), InitFunctor() ); std::for_each(v.begin(), v.end(), PrintFunctor() ); return 0; }
コンパイル
g++ function_object_2.cpp -o function_object_2
実行例
% ./function_object_2 0 1 2 3 4