「関数オブジェクト」の版間の差分
提供: C++入門
(ページの作成:「<!-- vim: filetype=mediawiki --> プログラミング言語の関数オブジェクト(function object)は、関数をオブジェクトにしたものです。 読...」) |
(→関連項目) |
||
(同じ利用者による、間の5版が非表示) | |||
行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 | ||
行122: | 行107: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == | + | == 関数オブジェクトを用いてstd::vectorを初期化する例 == |
+ | === ソースコード function_object_2.cpp === | ||
+ | <syntaxhighlight lang="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; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === コンパイル === | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | g++ function_object_2.cpp -o function_object_2 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === 実行例 === | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | % ./function_object_2 | ||
+ | 0 | ||
+ | 1 | ||
+ | 2 | ||
+ | 3 | ||
+ | 4 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == 関連項目 == | ||
* [[C++言語解説]] | * [[C++言語解説]] | ||
+ | * [[std::for_each]] | ||
+ | * [[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