C での関数オブジェクトとは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > C での関数オブジェクトの意味・解説 

C++ での関数オブジェクト

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/10/03 01:18 UTC 版)

関数オブジェクト」の記事における「C++ での関数オブジェクト」の解説

C++では、クラスあるいは構造体において関数呼び出し演算子の多重定義が可能となっている。具体的には、任意の引数を持つoperator()メンバー関数定義することで、そのオブジェクトインスタンスを指す変数の名前が、あたかも関数名関数指示子)であるかのような構文で、定義した関数を呼ぶことができる。このような C++オブジェクトを、C++ の用語ではファンクタ (functor) と呼ぶ(#C++のファンクタとファンクショノイド参照)。 struct my_adder { int operator()(int a, int b) const { return a + b; }};my_adder f;int result = f(2, 3);// 以下のように呼び出すことも可能だが、通例使われない。f.operator()(2, 3); C++のclass/structは、デフォルトアクセスレベルアクセス修飾子英語版))がprivate/publicであるという違いしかないため、関数オブジェクト記述ではclass代わりにstruct使われることも多い。 配列の中から特定の条件該当する要素個数数えルーチンの例を考えてみよう。ただし条件判定処理は自由にカスタマイズできるものとする関数へのポインタ使用する C のプログラムは、たとえば下記のようになる。 #include /* 引数条件該当する場合は 1 を、該当しない場合は 0 を返す */typedef int PredicateFunc(int x);size_t countIf(const int data[], size_t num, PredicateFunc* predicate) { size_t count = 0; size_t i; for (i = 0; i < num; ++i) { if (predicate(data[i])) { count++; } } return count;}int isPositive(int x) { return x > 0;}int isEven(int x) { return x % 2 == 0;}int main(void) { const int data[] = { 0, 1, 2, 3, 4, 5, 6, 0, -1, -2, -3, -4 }; printf("Count of positive numbers = %ld\n", (long)countIf(data, sizeof(data) / sizeof(*data), &isPositive)); printf("Count of even numbers = %ld\n", (long)countIf(data, sizeof(data) / sizeof(*data), &isEven));} 一方C++関数オブジェクト利用する下記のようになる。 #include template size_t countIf(const int data[], size_t num, TPredicate predicate) { size_t count = 0; for (size_t i = 0; i < num; ++i) { if (predicate(data[i])) { count++; } } return count;}struct IsPositiveFunctor { bool operator()(int x) const { return x > 0; }};struct IsEvenFunctor { bool operator()(int x) const { return x % 2 == 0; }};int main() { const int data[] = { 0, 1, 2, 3, 4, 5, 6, 0, -1, -2, -3, -4 }; std::printf("Count of positive numbers = %ld\n", (long)countIf(data, sizeof(data) / sizeof(*data), IsPositiveFunctor())); std::printf("Count of even numbers = %ld\n", (long)countIf(data, sizeof(data) / sizeof(*data), IsEvenFunctor()));} コールバック述語 (predicate) として countIf() 関数テンプレートに渡す際、関数へのポインタではなく構造体インスタンス関数オブジェクト)を渡していることに注意されたい上記の例において関数オブジェクトによるカスタマイズ可能にしているのは、テンプレート関数呼び出し演算子オーバーロードによる静的ダック・タイピングである。関数テンプレート実体化する際の字句解析適合しえすれば述語にはどんなオブジェクトでも渡せる。 コールバック関数実行されると、他のメンバー関数同様に働き、すなわちオブジェクト他のメンバーデータ関数に対して完全にアクセスすることができる。 クラス型関数オブジェクト加えてC++ では別の種類関数オブジェクトが可能である。[要校閲] C++ のメンバーポインタや、テンプレート機能利用することができ、テンプレート記述力により、(関数の合成などの)別種関数オブジェクト定義するといったいくつかの関数型言語技法用いることができる。[要校閲] C++Standard Template Library (STL) では、テンプレート述語 (predicate) として関数オブジェクト多用している。

※この「C++ での関数オブジェクト」の解説は、「関数オブジェクト」の解説の一部です。
「C++ での関数オブジェクト」を含む「関数オブジェクト」の記事については、「関数オブジェクト」の概要を参照ください。

ウィキペディア小見出し辞書の「C での関数オブジェクト」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「C での関数オブジェクト」の関連用語

C での関数オブジェクトのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



C での関数オブジェクトのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの関数オブジェクト (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS