C++:函数,函数! 作者: Semesse 时间: 2018-08-04 分类: 千叶 C/C++ 里面最有趣也是最强大的东西当然是指针啦,利用指针可以精确地控制内存,并且利用函数指针还可以实现一些运行时的多态。 函数指针一般是这么定义的: ```C 返回类型 (*指针名) (参数类型, 参数类型, ...) ``` 或者如果是类的成员的话,需要写成: ```C 返回类型 (类名::*指针名) (参数类型, 参数类型, ...) ``` 例如: ```C int (*p) (int, char**) = main; void (Animal::*fp) (string) = &Animal::say; //虚函数会返回虚表里的偏移,这里不讨论 ``` 轮子哥说过,有了指针甚至不需要 if ,具体实现像下面这样 ```C++ #include using namespace std; void _true_(){cout<<"Wow it's true"<1](); } ``` 相信聪明的读者一定猜出来了,输出是Wow it's true. 这里我们并没有用到 if ,但是利用了下标偏移(2>1 -> true -> 1)来实现与 if 相近的效果(除了写起来更复杂 如果和关联容器结合起来,那么函数指针又会更加强大。 比如这样: ```C++ std::map switcher; switcher[0] = _false_; switcher[0](); ``` 这是我在写 funcode 游戏的时候想到的,当时是为了做一个技能系统,长成下面这个样子 ```C++ std::map> spellTable; ``` 这样就做到了 switch 类似的效果,而且还可以动态增减,只需要操作 map 即可。 * 这里的 [std::function](https://zh.cppreference.com/w/cpp/utility/functional/function) 定义在 [functional](https://zh.cppreference.com/w/cpp/utility/functional) 头文件中,是标准库对于可调用对象的一点包装,可以用函数指针或者lambda表达式构造。而且还有bad_function_call的异常和诸如bind之类的工具让它便于使用。 函数还可以像下面这样用 ```C++ struct Event{ unsigned time; std::function callback; friend bool operator>(Event x, Event y){return x.time > y.time;} } std::priority_queue, std::greater> events; while(true){ ... if(events.top().time < getCurrentTime()){ events.top.callback(); events.pop(); } ... } ``` 在死循环中,如果当前时间过了优先队列顶部的事件预定的时间,那么对应的 callback 函数就会被调用,和 JavaScript 的 setTimeOut 倒是有一点异曲同工之妙。 最后,有兴趣的读者还可以了解一下lambda表达式,使用lambda表达式可以方便地创建匿名函数和闭包。参考 [cppreference](https://zh.cppreference.com/w/cpp/language/lambda)(都是专业术语,理解起来可能比较困难)或者其他人的博客。 标签: C/C++
好酷
函数指针在我应用就两处:
在写排序函数时传递一个cmp函数实现代码复用上个小学期在做Qt应用时给角色对象传递函数指针实现回调不过函数指针拿来玩玩还是挺有趣的,C++目前的函数式还比较鸡肋