“函数”类型的优点是什么(不是“指向函数的指针”)

时间:2010-12-21 07:33:49

标签: c++ c function-pointers

阅读C ++标准,我看到有“函数”类型和“函数指针”类型:

typedef int func(int);     // function
typedef int (*pfunc)(int); // pointer to function
typedef func* pfunc;       // same as above

我从未见过在示例之外使用的函数类型(或者我可能没有认识到它们的用法?)。一些例子:

func increase, decrease;            // declares two functions
int increase(int), decrease(int);   // same as above

int increase(int x) {return x + 1;} // cannot use the typedef when defining functions
int decrease(int x) {return x - 1;} // cannot use the typedef when defining functions

struct mystruct
{
    func add, subtract, multiply;   // declares three member functions
    int member;
};

int mystruct::add(int x) {return x + member;} // cannot use the typedef
int mystruct::subtract(int x) {return x - member;}

int main()
{
    func k; // the syntax is correct but the variable k is useless!
    mystruct myobject;
    myobject.member = 4;

    cout << increase(5) << ' ' << decrease(5) << '\n'; // outputs 6 and 4
    cout << myobject.add(5) << ' ' << myobject.subtract(5) << '\n'; // 9 and 1
}

看到函数类型支持C中没有出现的语法(声明成员函数),我猜它们不仅仅是C ++必须支持向后兼容的C包的一部分。

除了演示一些时髦的语法之外,还有什么用于函数类型吗?

4 个答案:

答案 0 :(得分:4)

一方面,你似乎在谈论一般的功能类型。另一方面,您的问题似乎是关于函数类型的 typedef names 的可用性。

函数类型本身是C和C ++语言中的基本概念。它们一直在使用。没有他们你就活不下去。每次声明一个函数时,都会声明一个函数类型的实体。每次使用指向函数的指针时,都使用指向函数类型的指针。等

至于为函数类型创建 typedef名称的可能性......我没有看到太多用途。我认为,它是C行李的一部分,因为它很容易做到,因此对C ++进行了一些扩展。

正如您所正确指出的,函数类型的typedef名称可用于声明成员函数(在C ++中,您还可以将const说明符包含在typedef中,如typedef int MemberType() const;)中所示,但是,例如,您不能将此功能用作作为模板参数传递的函数类型。

答案 1 :(得分:0)

boost:function使用这种语法,称为“首选”语法 似乎那种语法没有被广泛使用?与函数指针比较。

答案 2 :(得分:0)

你可以在Boost / TR1 / C ++ 0x中的新函数对象中看到它。

std::function<void()>接受带有operator()的任何对象,该对象返回void并且不带参数。

答案 3 :(得分:0)

这个有用的原因的一个例子是boost,你会看到很多。例如,在signals2库中:

boost::signals2::signal<void (int, int)> MySignal;

其中上面声明了一个信号,该信号将接受任何带有两个整数且具有void返回类型的函数。

相关问题