14

给定以下两个typedefs:

typedef void (*pftype)(int);

typedef void ftype(int);

我知道第一个定义pftype为指向一个函数的指针,该函数接受一个int参数并且不返回任何内容,第二个定义ftype为一个接受一个参数并且不返回任何内容的函数类型int。但是,我不明白第二个可能用于什么。

我可以创建一个匹配这些类型的函数:

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);
}

那么,函数类型有什么用呢?函数指针类型是不是覆盖了case,做起来更方便?

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 回答
0

我只想指出,我认为function_t *fptr ...funcptr_t fptr.... 第一种形式声明它必须是指针类型,这比任何东西都清楚,包括名称funcptr_t

于 2018-06-22T11:15:24.340 回答