博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正好碰到了C++的函数对象,查各路资料,总结写下来吧
阅读量:2440 次
发布时间:2019-05-10

本文共 1830 字,大约阅读时间需要 6 分钟。

       DTL中的BCA和BPA都是函数对象,如BCA的文档所说 A BCA is a function object (this can be a wrapped function pointer if you use cb_ptr_fun()) that is called to create an association between the columns in a SQL view  and the fields in a user defined data object that is used to represent individual rows from the view. Supported C++ types for binding to the fields in a database are shown in the BoundIO documentation.

        函数对象function object,实质上是一个实现了operator()--括号操作符--的类,BCA的一个代码如下:

class BCAExampleObj{public:	void operator()(BoundIOs &cols, Example &rowbuf)    	{	   cols["INT_VALUE"] >> rowbuf.exampleInt;	   cols["STRING_VALUE"] >> rowbuf.exampleStr;	   cols["DOUBLE_VALUE"] >> rowbuf.exampleDouble;	   cols["EXAMPLE_LONG"] >> rowbuf.exampleLong;	   cols["EXAMPLE_DATE"] >> rowbuf.exampleDate;	}}
     感觉就是将一个函数功能写成了类,感觉可以看做重载()操作符(当然,这里面还重载了>>、<<、==三个操作符,重载果然厉害)

     关于为什么要引入函数对象, 提出2个:一是,与函数指针相比,函数对象可以附带数据;二是函数对象可以封装类成员函数指针;函数对象之于函数指针的优势,也可以参考,而  则从函数指针的弱点提出,由于函数指针笨拙(其实已经很方便了)危险(这个倒是常提),所以函数对象的提出,很大部分,像是替代函数指针之用。关于STL中的函数对象,一个更详细的可以参考 另外则是提出了不少经常用到的函数对象,像for_each(),实际上,以前看C++ STL范例大全也有如下示例

#include 
#include
#include
using namespace std; template
class Print { public: void operator () (T& t) { cout << t << " "; } }; int main () { vector
v(10); Print
print; fill(v.begin(),v.end(),5); cout << "Vector v : "; for_each(v.begin(),v.end(),print); cout << endl; cout << "Size of v = " << v.size() << endl; cout << "v.clear" << endl; v.clear(); return 0;}
    里面的Print不也是函数对象呢么?for_each()也是,for_each()什么的,不说书写方便了,估计性能也是很可观的,高级货啊。貌似侯捷翻译这个是仿函数?不得不说,这个更贴切啊,虽然Function Object直译也没什么,不过总不如仿字传神,大师就是大师啊。

       搜的过程顺便看到关于快速排序,stdlib.h的qsort()和algorithm的sort(), 提到的一个细节,是写compare函数的时候(这个目前见到的大多都是函数指针吧,虽然应该也可以用函数对象),需要注意溢出等异常情况(反正我是直接return a<b,问题不大)

       就这样吧,留之,有用

转载地址:http://slcqb.baihongyu.com/

你可能感兴趣的文章
实例编程:用VC写个文件捆绑工具(转)
查看>>
教你如何用手工迅速剿灭QQ广告弹出木马(转)
查看>>
交换机及路由器如何才能更加安全?(转)
查看>>
chinaunix
查看>>
WinXP优化 全面消除操作系统的复制乱码(转)
查看>>
检查字符串strSource是否为big或big5码(转)
查看>>
提高网站在Google中的排名——面向搜索引擎的网站设计(转)
查看>>
SQL Server 存储过程的经典分页(转)
查看>>
学习J2ME编程需要掌握的七种技术(转)
查看>>
DB2 UDB V8.1管理学习笔记(二)(转)
查看>>
Symbian OS 开发初级手册(转)
查看>>
限制只能中文输入的方法(转)
查看>>
共享池 shared pool
查看>>
一张图搞定Java面向对象
查看>>
Borland ALM之需求定义和管理解决方案
查看>>
Verizon选择Borland控制开发流程并降低风险
查看>>
Borland 崭新的Caliber Define IT产品
查看>>
IBM Rational RequisitePro集成简介
查看>>
OOAD利器Rational Rose的介绍
查看>>
一年的测试生活和感悟
查看>>