14

次の 2 つtypedefの sがあるとします。

typedef void (*pftype)(int);

typedef void ftype(int);

最初の定義は、1 つのパラメーターを取り、何も返さないpftype関数へのポインターとして定義され、2 番目の定義は、1 つのパラメーターを取り、何も返さない関数型として定義されていることを理解しています。ただし、2 番目が何に使用されるかはわかりません。intftypeint

これらのタイプに一致する関数を作成できます。

void thefunc(int arg)
{
    cout << "called with " << arg << endl;
}

次に、それぞれを使用してこの関数へのポインターを作成できます。

int main(int argc, char* argv[])
{
    pftype pointer_one = thefunc;
    ftype *pointer_two = thefunc;

    pointer_one(1);
    pointer_two(2);
}

関数型を使用する場合、ポインターを作成していることを指定する必要があります。関数ポインター型を使用して、私はしません。どちらもパラメーターの型として同じ意味で使用できます。

void run_a_thing_1(ftype pf)
{
    pf(11);
}

void run_a_thing_2(pftype pf)
{
    pf(12);
}

では、関数型はどのような用途に使用されるのでしょうか? 関数ポインタ型はそのケースをカバーしていませんか?それはより便利ですか?

4

3 に答える 3

9

あなたが指摘した用途(ポインタの基になる型または関数への参照)と同様に、関数型の最も一般的な用途は関数宣言にあります。

void f(); // declares a function f, of type void()

を使用したい場合がありますtypedef

typedef void ft(some, complicated, signature);
ft f;
ft g;

// Although the typedef can't be used for definitions:
void f(some, complicated, signature) {...}

テンプレートパラメータとして:

std::function<void()> fn = f;  // uses a function type to specify the signature
于 2012-11-27T18:06:08.847 に答える
2

これも考慮してください

template<typename T>
void f(T*);

関数ポインタを受け入れたいので、パターンマッチングによって T は関数型になります。

于 2012-11-27T18:30:07.063 に答える