博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数对象
阅读量:6473 次
发布时间:2019-06-23

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

函数对象:

通常我们可以将函数作为参数传入另一个参数,比如qsort中传递函数指针。

STL函数对象则是函数指针的一种抽象形式。


传递方式:

由于标准库函数中,函数指针的传递是按照值传递的;所以函数对象在函数之间的传递也是 值传递

for_each示例:

template
Functionfor_each(InputIterator first, InputIterator last, Function f);//按值传递past-by-value

函数对象示例:

class Dosomething :public unary_function
{public: void operator()(int x){};};int main(){ typedef vector
::iterator IntIterator; vector
di; Dosomething d;//创建一个函数对象 //用类型参数dequeInerator和Dosomething&来调用for_each,这将强制d按照引用传递并返回 for_each
(di.begin(), di.end(), d); return 0;}

合理设计:

因为函数对象是按照值传递的,所以需要注意一些问题:

  • 函数对象应该尽可能的小, 减小拷贝时的花销
  • 函数对象应该是单态的,否则值传递过程中会发生剥离(派生类对象 赋值到 基类对象上,仅仅保留基类部分)

但是没有继承的函数子类感觉很鸡肋

解决:
将函数子类中的 大量数据 和 多态放置到一个新的类中,然后函数对象中值保存新类的指针。
(通过新生类实现多态并减小了函数子类的负担)

template
class BPFCImpl :public unary_function
{private: float a;//原来BPFC中的数据 int x; virtual ~BPFCImpl();//多态类需要虚析构函数 virtual void operator()(const T& val)conat; friend class BPFC
;//允许BPFC访问内部数据};//通过BPFCImpl的多态实现函数对象的多态template
class BPFC :public unary_function
{private: BPFCImpl
*pImpl;public: void operator()(const T& val)const { pImpl->operator()(val); }};

参考:

Effective STL

转载于:https://www.cnblogs.com/Przz/p/6591049.html

你可能感兴趣的文章
linux shell 正则表达式(BREs,EREs,PREs)差异比较(转,当作资料查)
查看>>
MongoDB--CSharp Driver Quickstart .
查看>>
#pragma mark 添加分割线 及 其它类似标记 - 转
查看>>
遗传算法实现自动组卷、随机抽题 (转)
查看>>
二分法求平方根(Python实现)
查看>>
使用startActivityForResult方法(转)
查看>>
so在genymotation中错误问题
查看>>
Visual Studio 原生开发的10个调试技巧(二)
查看>>
Windows内核再次出现0Day漏洞 影响win2000到win10所有版本 反病毒软件恐成瞎子
查看>>
H3C品牌刀片系统强势首发
查看>>
激励着我前进
查看>>
我的友情链接
查看>>
npm打包指定本地nexus仓库
查看>>
IP地址简介
查看>>
LDAP服务原理详解
查看>>
Docker容器初体验
查看>>
[ComandDetail] Vim
查看>>
delphi的加密与解密
查看>>
第3部分 管理NTFS权限
查看>>
我的友情链接
查看>>