阅读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包的一部分。
除了演示一些时髦的语法之外,还有什么用于函数类型吗?
答案 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返回类型的函数。