「関数オブジェクト」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「<!-- vim: filetype=mediawiki --> プログラミング言語の関数オブジェクト(function object)は、関数をオブジェクトにしたものです。 読...」)
 
(関連項目)
 
(同じ利用者による、間の5版が非表示)
行1: 行1:
<!--
 
vim: filetype=mediawiki
 
-->
 
 
 
プログラミング言語の関数オブジェクト(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
4
 
5
 
 
</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

関連項目