初识可调用对象模板类
|
|
这里用到了C++11的新特性——可调用对象模板类,可调用对象理解为函数,该特性可以用于定义函数指针,相当于是把函数本身做进一步抽象。这里利用该特性定义了三个回调函数,以第一个typedef boost::function<bool (const TcpConnectionPtr&, StringPiece,Timestamp)> RawMessageCallback
为例:
- 其中
function<bool (const TcpConnectionPtr&, StringPiece,Timestamp)>
意思是定义了一个可调用对象(函数指针),参数是三个const TcpConnectionPtr&, StringPiece,Timestamp
。 - 再利用typedef,定义了一个函数指针
RawMessageCallback
,或者说是一个可调用对象。
该上下文的调用如下:
|
|
用法实例
可以结合map
容器和该特性定义一张函数表,如下示例:
|
|
运行结果如下:
|
|
这里面有几个坑要注意:
auto mod = [ ](int i, int j)
定义了一个lamba表达式,即没有函数名的函数,这是什么鬼?注意函数实现最后有分号;
- 头文件一定包含全面,否则出来一堆错误,特别是
#include <stdexcept>
; - 如果想打印类型名怎么办?就像gdb中的命令ptype,C++也有类似的方法,首先包含头文件
#include <typeinfo>
,然后直接typeid(var)
即可。从运行结果可以看到迭代器本身的类型和迭代器成员的类型区别。 - 迭代器本身为指针,因此访问其成员用
->
操作符。
TODO: 容器遍历与访问的两种方法:迭代器和容器内部方法之区别。