2012-01-16 10 views
1

iはC++での関数宣言を持って、それが働いているかを知る必要がありました:奇妙な機能

template<class x> 
    int fun(x, x(*)(x*)); 

最初の引数は、タイプxの目的です。そして、どのように2番目のものを記述するのですか?

+3

テンプレートとしてCでは動作せず、クラスはC++コンストラクト。 –

答えて

5

これは、整数を返し、パラメータとしてxと、xを返し、x*を返す関数へのポインタを引数とする宣言です。

x(*)(x*)は、「xを返し、パラメータとしてx*を返す関数へのポインタ」を意味する部分です。最初のxが戻り値の型であり、(*)はそれが関数へのポインタであることを示します(パラメータに名前がある場合はx(*argname)(x*)と書かれます)。そして3番目のx*は単なる引数です。

それは次のようになり呼び出す:

int f(int* iptr) { return something; } 

fun(4, f); // no need for the explicit template parameter because it can be deduced 

以上の一般

template<typename x> 
x functionname(x* xptr) { return something; } 

ダニエル・ホワイトはコメントで言ったように、Cはテンプレートを持っていない、ので、それはCで動作しません。 。

4

xがクラスである第2のパラメータタイプ:

x(*)(x*) 

手段「機能xを返すとx*を取るへのポインタ(*)は、例えば:

class MyClass {}; 
MyClass doit(MyClass* arg) { return *arg; } 
MyClass instance; 
int result = fun(instance, doit); 
+1

これを満たす宣言の点では、 'x foo(x * bar)' –

1

これはポインタであります型xのオブジェクトを返す関数に渡し、型xへのポインタの1つのパラメータを得ました。