marunomaruno-memo

marunomaruno-memo

[C++] 関数テンプレートのポインター

2014年06月19日 | C / C++
                                                        2014-06-19 新規
[C++] 関数テンプレートのポインター
========================================================================
(MinGW gcc (GCC) 4.5.4)

□ functionpointer_template.cpp
---
#include <iostream>
using namespace std;

template<class T>   // (1)
T square(T a) {
    return a * a;
}

template<class T, class F>  // (2)
T calc(T a, F func){
    return func(a);
}

int main() {
    int (*p)(int) = square; // (3) この使い方はあまり意味ない感じ
    cout << p(2) << endl;   // (4)
    cout << p(3.4) << endl; // (5) 

    cout << calc(2, square<int>) << endl;   // (6) 
    cout << calc(3.4, square<double>) << endl;  // (7)
//  cout << calc(5, square) << endl;    // コンパイルエラー

    return 0;
}
---

□ 実行結果
---
4
9
4
11.56
---

(1) 関数テンプレートの宣言

(2) 関数テンプレートのポインターを引数に持つ関数テンプレートの宣言

(3) 関数テンプレートを実体化したものを関数ポインターに設定

関数ポインターは、通常の関数ポインターと変わりはない。テンプレートの型は
自分で設定している。
    int (*p)(int) = square; // (3) この使い方はあまり意味ない感じ


(4)(5) 関数ポインターの利用

int 型の引数を取るので、そのまま使う。
    cout << p(2) << endl;   // (4)

int 型の引数を取るので、double 型の引数を渡しても、int 型として処理され
る。
    cout << p(3.4) << endl; // (5) 


(6)(7) 関数テンプレートのポインターを引数に持つ関数テンプレートの利用

int 型を明示しているの、int 型の引数の square 関数ポインターを渡す。
    cout << calc(2, square<int>) << endl;   // (6) 

double 型を明示しているの、double 型の引数の square 関数ポインターを渡す。
    cout << calc(3.4, square<double>) << endl;  // (7)

つぎのように、データ型を明示していないと、コンパイルエラーになる。
    calc(5, square)

    no matching function for call to 'calc(int, <unresolved 
    overloaded function type>)'

                                                                   以上


最新の画像もっと見る

コメントを投稿