「関数オブジェクト」の版間の差分
提供: C++入門
(→関連項目) |
(→関連項目) |
||
(同じ利用者による、間の2版が非表示) | |||
行1: | 行1: | ||
− | |||
− | |||
− | |||
− | |||
プログラミング言語の関数オブジェクト(function object)は、関数をオブジェクトにしたものです。 | プログラミング言語の関数オブジェクト(function object)は、関数をオブジェクトにしたものです。 | ||
− | 読み方 | + | '''読み方''' |
− | + | ||
;[[関数オブジェクト]]:かんすう おぶじぇくと | ;[[関数オブジェクト]]:かんすう おぶじぇくと | ||
;function object: ふぁんくしょん おぶじぇくと | ;function object: ふぁんくしょん おぶじぇくと | ||
行13: | 行8: | ||
== 概要 == | == 概要 == | ||
− | |||
()演算子をオーバーロードしたものを[[関数オブジェクト]](ファンクタ)と呼びます。 | ()演算子をオーバーロードしたものを[[関数オブジェクト]](ファンクタ)と呼びます。 | ||
[[関数オブジェクト]]は、 | [[関数オブジェクト]]は、 | ||
行20: | 行14: | ||
== 関数オブジェクトを作ってみる例 == | == 関数オブジェクトを作ってみる例 == | ||
− | |||
=== ソースコード function_object_0.cpp === | === ソースコード function_object_0.cpp === | ||
− | |||
引数をただ表示するだけの[[関数オブジェクト]]の例です。 | 引数をただ表示するだけの[[関数オブジェクト]]の例です。 | ||
行53: | 行45: | ||
=== コンパイル === | === コンパイル === | ||
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
g++ function_object_0.cpp -o function_object_0 | g++ function_object_0.cpp -o function_object_0 | ||
行59: | 行50: | ||
=== 実行例 === | === 実行例 === | ||
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
% ./function_object_0 | % ./function_object_0 | ||
+ | 1 | ||
2 | 2 | ||
3 | 3 | ||
− | |||
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== 簡単な関数オブジェクトの例 == | == 簡単な関数オブジェクトの例 == | ||
− | |||
=== ソースコード function_object_1.cpp === | === ソースコード function_object_1.cpp === | ||
− | |||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
#include <iostream> // std::cout, std::endl | #include <iostream> // std::cout, std::endl | ||
行107: | 行94: | ||
=== コンパイル === | === コンパイル === | ||
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
g++ function_object_1.cpp -o function_object_1 | g++ function_object_1.cpp -o function_object_1 | ||
行113: | 行99: | ||
=== 実行例 === | === 実行例 === | ||
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
% ./function_object_1 | % ./function_object_1 | ||
行123: | 行108: | ||
== 関数オブジェクトを用いてstd::vectorを初期化する例 == | == 関数オブジェクトを用いてstd::vectorを初期化する例 == | ||
− | |||
=== ソースコード function_object_2.cpp === | === ソースコード function_object_2.cpp === | ||
− | |||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
#include <iostream> // std::cout, std::endl | #include <iostream> // std::cout, std::endl | ||
行160: | 行143: | ||
=== コンパイル === | === コンパイル === | ||
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
g++ function_object_2.cpp -o function_object_2 | g++ function_object_2.cpp -o function_object_2 | ||
行166: | 行148: | ||
=== 実行例 === | === 実行例 === | ||
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
% ./function_object_2 | % ./function_object_2 | ||
行181: | 行162: | ||
* [[std::vector]] | * [[std::vector]] | ||
* [[ラムダ式]] | * [[ラムダ式]] | ||
+ | * [[std::function]] | ||
+ | <!-- vim: filetype=mediawiki --> |
2014年8月27日 (水) 19:39時点における最新版
プログラミング言語の関数オブジェクト(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 1 2 3
簡単な関数オブジェクトの例
ソースコード 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