1

これはファンクタです:

class add_x {

 int x;

public:
  add_x(int x) : x(x) {}
  int operator()(int y) { return x + y; }

};

そしてメインから私はこれを行うことができます:

add_x add10(10); // create my functor 
int i = add10(20); // add 20 and return it 

ファンクターを と組み合わせるにはどうすればよいtypedefですか?

たとえば、私はこれに出くわしました:

typedef int (*myfuncType)(float f, char c1,char c2);
myfuncType pt2Function = NULL; 

しかし、ここで正確に何を定義しているのでしょうか? 演算子()?

4

3 に答える 3

5

関数ポインターは、その名前が示すように、関数への単なるポインターです。関数へのポインターを使用してファンクターを指すことはできません。ファンクターは本質的にオーバーロードされた () 演算子を持つクラスです。

C++11 の std::function に興味があるかもしれません:

#include <functional>

(...)
std::function<int(int)> fn = add_x(10);
int i = fn(20);


編集:わかりました、あなたが何を求めているのか。

たぶん、いくつかのコードが物事を明確にするでしょう。

int fn(float a, char b, char c) { ... }

(...)

typedef int (*myFuncType)(float f, char c1, char c2);

myFuncType ptrToFun = &fn;

(*fn)(1.0f, 'a', 'z');

この typedef は、「関数へのポインター」型を作成します。この型の変数を宣言すると、(通常の & 演算子で抽出された) 関数へのポインターをそれに割り当てることができます。たとえば、別の関数に渡すか、単に格納する (またはこの関数を呼び出す) ことができます。

std::function は、関数、ファンクター、またはラムダへのポインターを格納して通常どおり呼び出すことができるため、はるかに柔軟です。

于 2012-07-13T07:09:03.757 に答える
3

あなたの最初の質問 ( How can I combine the functor with typedef ?) が理解できないので、答えられません。a はtypedef他のクラスと同じように機能します。

2番目の質問について:行

typedef int (*myfuncType)(float f, char c1,char c2);

型に名前 ( myfunctType) を付けint (*)(float, char, char)ます (読み取り: "afloatと 2 つのchar値を取り、" を返す関数int)。

そう

myfuncType pt2Function = NULL;

そのような上記の関数を指すことができる変数を定義しますが、現時点ではポインターを NULL に設定します。

于 2012-07-13T07:10:46.150 に答える
1

ここでmyfuncTypeは、3 つの float パラメーターを持ち、int を返す関数のポインターを記述する型です。ファンクターは、operator() オーバーロードを持つ単なるクラスです。したがって、typedef は他のクラスと同じように使用されます。

typedef add_x add動作します。

于 2012-07-13T07:12:41.907 に答える