办证
话说8月份的时候我总算把人事代理的事情弄得七七八八了。因为我的身份证是老家那边的,所以户口迁移到广州以后还需要换领一个新的广州的身份证。换领的大部分手续都有人帮我搞定了(嘛,怎么说我也是付了钱的哦!),给了我一张回执,上面写着领证时间是2009年9月9日,所以昨天下午我就准备跑去把剩下的东西搞定。
跑到去领证的地方已经是下午4点了……在我的前面还有一个,似乎也是来领证的。我看见他把和我的回执一样的东西交给你mm以后,mm拿了一张纸给他填,说是借条。我还在想这老兄是不是准备办啥结婚证的东西要借户口卡之类的。结果轮到我的时候她一样拿出了张借条要我填……后来才明白,原来我这一趟还不能领到证!我走这一趟是为了把户口卡借出来,然后我还需要跑去专门的办证中心搞才能把证领到手……为了借出户口卡我还得把我的毕业证押上了(没料到有这么一手……身上没足够现金交押金,只能先押毕业证),言下之意就是为了把我的毕业证赎回来我还得跑多次这个人事代理中心……OMG。
原来办个证是这么麻烦的!
问题一浪接一浪
话说刚刚才把ADSL Modem换掉了,接着第二天又有东西出毛病了。这次轮到我的notebook了……最近RP太衰了吧!
没记错的话应该是用了快一年了吧,神舟的笔记本。今天上班打开,发现花屏;把屏幕揭几次又好了,不过偶尔还是会出现问题;机器开久了问题又基本不出现了。
星期天要不要拿过去保修呢……
说回来,这笔记本买回来以后是第一次经历夏天呢……没有空调的夏天……希望它不会在我和夏天的热浪折磨底下提早退休吧……
和ADSL斗RP
话说这个周六日在家里“度假”完回到番禺的“狗窦”,发现跳闸了。看样子在我回来之前打过一场大雷呢!本来以为把闸打回去就啥事都没了结果似乎还上不了网。下意识把视线转到ADSL Modem上去。如我所料DSL灯没亮。
这 个DSL灯的问题似乎可以追溯到我决定换房间的那个时候。从那时开始ADSL就似乎变得很容易断,DSL灯也开始喜欢闪啊闪,有时甚至直接黑掉。有时我也 会因为断得太频繁了点而十分恼火。不过通常都是reset一下modem,或者稍微等它断个5分钟左右就没事了,也懒得去找电信局问是不是有啥问题。
本以为这次也是一样的,于是reset modem,DSL开始闪啊闪。正当我以为DSL灯马上要常亮的时候……
它居然灭了!
一次不行就再来一次咯,再来一次!
它还是没亮!
Again!
……黑的……
OMG……之后继续试了估计有10来次,还是不行。于是胡乱捣鼓起来,电话线啊,分线器啊,电话机之类的都胡乱搞了一通,居然又行了,虽然通之前还经历了好几次闪完灭。
这时的我还天真的以为事情就这样结束了……
星 期一,8月的最后一天,也是我8月份账单的还款期的最后一天。本来打算在公司看看自己到底还清款了没有的,结果回到宿舍才发现忘记了,只能用自己的电脑上 网再看看。下意识把视线瞄向modem……shit,黑的。于是又把modem reset了一次又一次,分线器啊电话机啊什么什么的弄来弄去,结果弄了接近2个小时都上不了网!害我还尝试用手机暂时上完看完罢就……不过手机上网的速 度实在太囧,而且现在的网站啊,图片都一大堆,流量十分厉害……load了估计1/5之一还没有就放弃了,继续鼓捣。最终不知道如何还是勉强能上了,谢天 谢地……
被郁闷过以后我就马上向电信报障了。电信mm说24小时内会帮我搞定,这样算的话明天的晚上就不用再受这种苦了吧。
现在想想,大概modem是被星期天的那个雷劈痴线了吧。
睡觉之前关上电脑,又看了一眼DSL灯:灭了,几乎就在我电脑关上的同一时间。
Another day, another story of 抓狂。电信的效率信半成都可以去死了,结果星期二仍然要和ADSL玩RP游戏。
今天(昨天?)的下午,电信的工作人员终于来了,简单的看过一下,他告诉我:Modem坏了,你去买个新的吧。
我还以为你们电信能免费帮我替换呢……
于是又不得不跑出市桥花了100大洋买了个新的ADSL Modem回来。这一晚,我终于不用再玩RP游戏了……
水啊水!
话说广州前几天的天气热得要命,每天晚上两把风扇开到最大档了身上还是不断冒出汗来,经常因为这样睡不着觉。于是我天天盼夜夜盼,啊,快点下雨吧!结果就盼来了“天鹅”,昨天开始大风刮来,晚上开始下雨了。空气凉爽,心情舒畅,打机也打得开心点。
没想到精彩的今天早上才来到,早上起来在宿舍呆坐了半个钟,大雨没停,雷声不断。等来等于不见雨变小,只好硬着头皮上班去。村子里的路全部被水淹没了,无论如何都找不到个可以不湿脚的地方。无奈之下只能淌着水走过去了。到了办公司自然波鞋已经变水鞋了,裤子湿掉了一半。我所在的办公室地势较低,我回到去的时候办公室也已经开始进水了,不过还十分轻微。看来扫地阿姨已经为大雨做足准备了。
过不久雨便停了。啊,总是这样的,每次下大雨的时候上下班,总是等啊等等雨小一点,结果10次有8次是等啊等不见雨小,然后冲回去。结果冲到回去不到3分钟,雨就停了!是不是我今年忌水呢……有没有看相先生/小姐帮我看看?
然后更囧的跟着来了。我走到车间去办办事,办到一半雨又噼里啪啦再下过。办完了还在下,结果我被困了在车间。接着,10次有8次就进化成10次有9次,不过这不是之后的故事的重点。
当我回到办公室的时候大概过了有半个小时。这半个小时内办公室就被水淹了有1cm。水源……不是外面下着的大雨,而是厕所的下水道……大概是下水道堵塞,水回涌到办公室了吧。水是清的,但能看见上面飘着只小强的尸体……OMG。
结果今天整天都去做“抗洪”卫士了。
我要不要学学怎么开锁?
没错!我又被锁了!这应该是今年内第3次被锁了……2009才过了一半多点啊,莫非接下来我还要被锁2,3次……学学怎样开锁下次被锁了的时候说不定可以少点郁闷。
嗯,顺便回顾一下这3次被锁都是些什么事件:
第一次被锁在6月12日,地点在番禺的出租屋。原因怀疑是被小偷光顾,不过开锁失败,弄坏了锁,结果就被锁在门外……(其实,我还是庆幸自己能被锁在了房子外面……不然的话我房子里面的东西估计就被扫光了)
第二次被锁在6月21日,地点在我老家自己的房间。原因不详,估计是RPWT,早上醒来开门去厕所小个便后睡回笼觉,睡醒以后就发现门锁已经坏掉了……结果就被锁了在房子里面。
第三次被锁是在昨天(写这post的时候已过12点),地点还是在我老家自己的房间。原因估计是球锁锁钮被按下了的房门被风吹上了,加之我自己没有钥匙(家里的锁这几年来换过几次,而我又不是经常在家的,所以我身上没有带着老家的钥匙,带了也可能是开不了的),结果就被锁在门外了。
点名帖
被猪头Jessie点到了。
- 大名小名?
- 生日?
- 被谁点名?
- 生日最想要什么?
- 喜欢什么颜色?
- 喜欢什么明星?
- 喜欢什么歌手,什么歌曲?
- 喜欢什么电影?
- 喜欢什么电视剧?
- 喜欢什么风格的衣服?
- 喜欢吃什么?
- 喜欢什么男人<女人>?
- 近期的心愿?
- 长远目标?
- 近期让你烦恼的事?
- 近期让你失望的事情?
- 近期让你开心的事情?
- 最近常想起的人?
- 觉得自己最得意的事情?
- 自己做过最失望的事情?
- 爱情友情亲情什么重要?
- 男女间有纯粹的友谊吗?
- 暗恋过别人吗?
- 主动表白过吗?
- 觉得怎样才算浪漫?
- 做过的事情里有后悔的吗?
- 伤心难过会怎样?
- 最难过是什么时候?
- 无聊怎么打发时间?
- 会失眠吗?觉得是什么原因引起?
- 理想的生活是怎样的?
- 对点你名人的印象?
- 你们认识多久?
- 点名者在你心里的位置?
- 记得朋友的生日吗?
- 喜欢哪个城市?
- 喜欢哪个季节?
- 生活里最三八的人是谁?
- 为爱的人做过自己觉得了不起的事?
- 口头禅是什么?
- 重要的日子是什么?
- 最近常笑吗?因为什么?
- 最近常哭吗?因为什么?
- 如果明天中五百万你第一件事会做什么?
- 去KTV最拿手的歌?
- 异性朋友多不多?同性朋友多不多?
- 觉得什么才算朋友?
- 最怕什么?
- 掉眼泪是软弱的表现吗?
- 出门第一件事情?
- 喜欢的动物是什么?
- 有几双鞋子?
- 爱逛街吗?
- 现在用的包是什么颜色的?
- 喜欢过白天还是黑夜?
- 对自己哪里最满意?
- 现在烦不烦?
- 如果对恨的人说一句话会说什么?
- 你觉得你和陈冠希哪个帅?
- 小时候最深刻的事情?
- 觉得自己现在孤单吗?
- 如果受伤会怎么抚平?
- 有过自杀的想法吗?什么时候?
- 酒和烟什么比较有吸引力?
- 如果你可以马上实现一个愿望,你希望是?
- 觉得多啦A梦和麦兜喜欢哪个?
- 现在脑子里想着谁?
- 如果遇到坏人怎么办?
- 觉得自己是好人吗?
- 我的问题多不多?
- 爱谁时间最长?
- 你记得自己第一个同桌是谁吗?
- 为什么你的通讯录里没有我的号码?
大名X小名x全名真多X
1985-06-20
JessieLin
BG大家
蓝
我不追星
歌手?很少记名字……歌是我觉得好听就喜欢了
很少看电影,无法回答
是电视剧我都喜欢泡,但说到喜欢呢……Laughing Gor!
没有特别要求
辣的和苦的除外
你如果问不喜欢什么女人我估计还能答,喜欢的话……最紧要将feel的
完成GAF
well……一时间答不到。相对长远一点的算不算?做一个“我们的”Galgame。
感情的,工作的,是人基本上都会烦恼的那些。
好像没有?
今个月的奖金不错
老爸+老妈
继续没有?
同上
你没要求单选。不过要不要求我都只会答都重要。
有
有,而且很多
有
别人都说我木
嗯……应该有吧,比如说那个,比如说那那个……
不定,有时候会流下男儿泪,有时候会打机打发掉,有时候会call朋友打发掉
我发现这些问题好像都差不多……有但不记得了
打机,看书,写代码
会,生理性失眠:昨晚通顶了今天一睡睡到下午6点,于是就失眠了。
在空调房里面看书,喝咖啡,code
猪头一个
我还是大三学生时的一个夜晚。她,我人生中一个重要的XX,出现了。
也就是说有快4年了吧。
我生命中认识到的重要的……………
………………………………………………
………………………………………………
………………………………………………
……………………猪头中的其中一只。
记得,因为有很多东西都会提醒我朋友的生日。
广州和佛山
冬天,因为被窝很舒服!
点我名的这个
嗯……好像没?
很多的哦!比如说,“嘛”,“囧!”
放假的日子
我经常笑,没为什么,就爱傻笑
No,因为没什么值得我哭
存起来,然后逐步实施我构想已久的“阳谋”!
我没去过KTV
多不算多,都差不多
冇乜具体标准的,我认为是就是了。
蟑螂等一切拍死了以后很核突的生物。
不一定
出门以后的第一件事?关门。
狗,猫,马,鸟,很多很多
经常只有一双,偶尔两双
也说不上喜欢,说不上讨厌
黑色
黑夜,因为最近我很野猫
没有。
之前不是问过了吗?
“……”
我
被烟花烧到颈了
不觉得
过几天就自然抚平了
有过,不只一次,不过终究只是考虑各种可能性的时候顺带产生的其中一种想法。某一次是在1年半前。
都没有,我都不喜欢
变成有钱佬
麦兜
麦兜。因为上一题刚刚答完
还真的没想过,随机应变吧。
算吧
很多
算上暗恋的吗?算的话,高中时候从高一暗恋到高三上学期的某女生。
太久远了!我的生活和galgame里面的情节差太多,没有所谓的青梅竹马,所以也不会记得。
你肯定是吃过期罐头吃多了,居然敢说我的通讯录里面没有你的号码
我可没办法找到10个人那么多去传。鉴于你这个要求太无理,我就不执行了。
继续流水账
话说最近越来越喜欢尽可能地在Emacs里面搞定一些日常的东西,比如说写的这篇Post。没错,这篇Post是在Emacs里面写的,至于效果如何……其实我也是第一次用……
最近Jessie跟我说打不开我的blog。后来试过实际上打还是能打开的,只不过慢的囧,用了代理可能会有所改善吧。Godaddy的域名是搞得比较有名气的,但主机的部分就马马虎虎。今年过后再找别的空间看看吧。
不过现在才过了半年呢……嘛,访问rss feed是相对比较快点的,所以……欢迎订阅:http://feeds2.feedburner.com/xtheukn!
潜水1个多月,都干了些啥呢?嗯……
5月中旬从Raine JJ那里得知网易有道和TC合作搞编程竞赛跑去参加了。其实在大学时期就已经知道Topcoder的大名,只不过一直都没想过去试试。做过好几次练习和比赛以后才倍感自己水平太低了,DIV1的题目只能勉强推倒前两题(有时还推不倒……);然后总喜欢在比赛以后和某人讨论500分的题目,讨论一个多小时后两人一起恍然大悟:“哦!”(或者……“啊啊啊啊啊!”)。几次下来觉得这样的比赛很有趣,虽然到目前为止我还没challenge过别人……嘛,多点参加这样的活动应该对我很有益的,以后也多点参加好了~
上面说的是TC的部分。至于网易有道和TC合作的部分……嘛,算是勉强进入了晋级赛,有件免费的T-Shirt(今天刚刚送到),有个“绿色通道”的机会,接下来就是等着在21日的晋级赛里面当炮灰了。不过当炮灰也当得很有意义就是。
然后其余时间就是玩点游戏和继续开发GAF。嗯……不过开发着开发着,总发现自己的经验还是差很多,想把系统设计得好一点,最终的结果就是已经做好原型改了一次又一次。嘛,这也算是个学习的过程吧,不过效率似乎很低……
最近又燃起了对Galgame的爱了!5、6月里面玩了2个新作,有一个现在仍然在继续,有All Clear的想法啊!逆转口水肩(逆转检事)也在5月底出了,花了不少时间总算通关。老实说我还是喜欢逆转裁判系列多一点,可能是因为逆转口水肩的故事和逆转裁判系列的关联性少吧……不过撇开故事本身,其他方面还是一贯的“逆转”水准,BGM经常听得我热血沸腾啊!
这部分是从Emacs发布以后才加上去的。发布出来的效果似乎不错,只是……permalink没有被pinyin slug转换的样子……另外……=。=我现在还只会发纯文字的。
潜水了一个多月
上浮一下。看看最后一篇写事的post,原来已经是2月份的了,这么说其实我潜水已经有快3个月咯……自己没啥感觉,可能是因为生活一直都不够激情啊。
3月份开始就受raine师姐引诱,一起跳进了GAF的坑里面去了(Well,其实GAF只是我擅自作出来的名字……我们两个并没有在叫什么名字这个问题上花过心思)。然后就发现自己在思维上的诸多不足。嘛,经验不足应该也是一个原因。raine姐你千万别介意多拉我几把啊!
(顺便再BS某sara)
然后现在项目处于"SUCKED"状态。啊神啊,快点给我点灵感吧!
C++高阶函数(一)
0. 前言
看见了标题不要以为以下的内容是C++的高级话题。这里的``高阶''是与``函数''连在一起作为名词的。高阶函数(high-order functions)有点借用了数学中高阶的概念。当一个函数是以另一个函数作为参数,或者以另一个函数作为返回值的时候(或者两者兼备),就可以称作是高阶函数。举个例说:
typedef int (*int_func)(int); int f(int_func g, int x) { return g(x); }
这里,函数 f 就可以称作是一个高阶函数,因为它以另一个函数(实参 g )为参数。
高阶函数在函数式编程里面是很普遍,在命令式编程里面可能比较少提到,但对于C++来说,高阶函数已经不是新事物了。很多地方,例如C++的标准库自身,或者C++的巨牛库boost,对在C++中使用高阶函数已经有不同方面的支持。虽然目前还有很多方面我还没有触及到,但为了避免自己没记性忘掉,我还是准备把我不完全的认识先记录下来,日后继续慢慢更新。嗯,期待自己能写出一个系列呢~。
1. 函数的生成
生成函数?
假如现在有一个简单的函数(实际上是函数对象。这里用的是函数的纯抽象概念:只要表现得和函数一样的,都可以叫作``函''。下面的描述,如果不需要严格区分函数和函数对象,那么我一律称作函数),作用是做加法的:
template <class T> struct x_plus { T operator () (T op1, T op2) const { return op1+op2; } };
如果有两个int变量x, y,那么
x_plus<int>()(x, y);
得到的结果就是x+y。对于x_plus<int>()来说,它是一个二元函数。
通过把其中一个值变成常量,x_plus<int>()就可以表现像一个一元函数了:
x_plus<int>()(x, 1); // --------------- (1)
相当于计算x+1。
函数生成的过程与上面的这个过程是类似的。通过将一个函数的某一个变量绑定为另外一个变量,就可以得到一个新的函数。
然而严格地说,上面的函数调用(1)依旧是二元函数,只不过其中一个参数被固定了。对于一个一元函数,它被期望的调用方式应该是:
_i_am_an_unary_function_(x);
于是,在对于一些需要使用一元函数的场合,x_plus<int>()是无法使用的:
template <class unary_function> inline int _i_need_an_unary_func (unary_function f, int x) { return unary_function(x); } _i_need_an_unary_func ( x_plus<int>()(x, 1), 10 ); // error
std::bind1st和std::bind2nd
标准库的std::bind1st和std::bind2nd提供了一个解决方案,使得我们可以将x_plus<int>()转化为一个真正的一元函数:
#include<functional> using namespace std; _i_need_an_unary_func ( bind2nd(x_plus<int>(), 1), 10 ); // ok _i_need_an_unary_func ( bind2nd(x_plus<int>(), 1), 10 ); // ok
这里的x_plus<>实现于最开始时候定义的有点区别,会在后面说明。
std::bind2nd(x_plus<int>(), 1)和x_plus<int>()(x, 1)的区别在于前者将一个参数绑定到某个已有函数的某个实参上,从而生成一个新的函数,而后者是一个函数调用(而且是不合法的函数调用,这里的 x 会因为未定义而产生编译错误)。所以对于std::bind2nd(x_plus<int>(), 1),以下的调用是合法的:
bind2nd(x_plus<int>(), 1)(10); // ok, equivalent to function call: x_plus<int>()(10, 1)
std::bind1st和std::bind2nd是类似的,区别在于绑定参数的位置不一样:
bind1st(x_plus<int>(), 1)(10); // => x_plus<int>()(1, 10) bind2nd(x_plus<int>(), 1)(10); // => x_plus<int>()(10, 1)
因为std::bind1st和std::bind2nd的实现是类似的,我只考虑实现其中一个的基本原理:
bind1st返回的可以是普通函数指针或者函数对象,然而对于返回普通函数指针,实现起来似乎不怎么方便>*<,所以一般都是返回函数对象:
template <class F, class A1> struct x_bind1st_c { x_bind1st_c(const F& _f, A1 _a1) : f(_f), a1(_a1) { } return_type? operator () (argument_type? a2) const { return f(a1, a2); } private: F f; A1 a1; };
上面的实现还未完整,但不妨先进行分析。通过x_bind1st_c< x_plus<int>, int >(x_plus<int>(), 1),就可以产生一个函数对象func。函数对象里面已经定义了operator()(...)的成员,所以可以通过func(x)的方式来调用这个函数对象,达到预期的效果。
实现中还有部分地方没有明确:operator()(...)的返回类型是什么?实参a2的类型又是什么?或许可以假定为与A1相同,但这毕竟没有普适性:要求一个函数的返回值与实参类型相同、所有实参的类型都一样,这样的要求显然不合理。函数需要返回什么值,实参接受什么类型,是被绑定的函数决定的,如此考虑的话,直接从被绑定函数中获取是最好的方法。为了这样,需要对x_plus<>的定义稍微修改一下:
21 22 23 24 25 26 27 28 29 30 | template <class T> struct x_plus { typedef T return_type; typedef T arg1_type; typedef T arg2_type; T operator () (T op1, T op2) const { return op1+op2; } }; |
然后……重新写一次完整的x_bind1st_c的定义吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | template <class F> struct x_bind1st_c { typedef typename F::return_type return_type; typedef typename F::arg1_type arg1_type; typedef typename F::arg2_type arg2_type; x_bind1st_c(const F& _f, arg1_type _a1) : f(_f), a1(_a1) { } return_type operator () (arg2_type a2) const { return f(a1, a2); } private: F f; arg1_type a1; }; |
x_bind1st_c是一个类模板,使用的时候必须显式指定模板的参数。可以利用函数模板的自动推导简化使用:
16 17 18 19 20 | template <class F> inline x_bind1st_c<F> x_bind1st(F f, typename F::arg1_type a1) { return x_bind1st_c<F>(f, a1); } |
x_bind1st就这样完成了。(我并没有看过标准库的实现,所以我不保证这就是std::bind1st的实现方式。事实上我觉得标准库应该比我上面简单的实现考虑得更多,比如const和volatile关键字的修饰。不过我觉得基本原理应该是这样的。)
x_bind1st(算是简化+删节版的std::bind1st吧,所以下面把两者合在一起统称bind1st/bind2nd)的实现同时也提示了几点:
1、只能用在接受两个参数的函数对象上。
所以对于非二元的函数对象,无法使用bind1st/bind2nd;而且对于普通的函数,因为缺少return_type、arg1_type和arg2_type的定义,所以也不能直接使用;相同的情况存在于类成员函数指针中,不过成员函数指针的情况有点特殊,下面将会提及。
为了让bind1st/bind2nd可以为普通的函数绑定,标准库定义了一个ptr_fun,用来包装普通函数,使得bind1st/bind2nd可以用在普通函数上;对于类成员函数指针,标准库也定义了mem_fun/mem_fun_ref来包装,使得bind1st/bind2nd可以用在成员函数指针上:
int func1(int op1, int op2) { return op1+op2; } struct X { int func2(int op) { return op; } }; std::bind2nd(std::ptr_fuc(func1), 10)(20); std::bind1st(std::mem_fun(&X::func2), &x)(10);
成员函数X::func2只接受一个参数似乎和之前的说明矛盾。其实这是因为成员函数需要接受一个额外的参数(this指针的由来)。除去这个额外参数以后,就只能再接收一个了。
2、被绑定的参数只能是兼容于被绑定函数的可接收参数的类型(即存在隐式转换)。
简单的说就是你不能这样调用bind1st/bind2nd来实现生成类似于f(x)=(10+x)+x的函数:
std::bind1st( x_plus<int>(), std::bind1st(x_plus<int>(), 10) )(20);
原因很简单,因为经过bind1st/bind2nd后得到的是一个函数。除非原来的函数接受的就是函数类型的参数,否则,由于不存在隐式转换,这样的调用将产生错误。
* 或许可以考虑一下返回的是一个函数指针。但如果返回的是一个函数指针,那么这个函数的定义至少应该类似于:
R bind1st(A2 a2) { return &func_to_be_bound(a1_bound, a2); }
返回值、参数a1和a2的类型先不作考虑。
为了记录func_to_be_bound,bind1st必须定义为一个函数模板。这样的话就要求函数的参数列表中须新增用来接受func_to_be_bound的形参。这样的话又会破环bind1st的接口:
template <class f> R bind1st(A2 a2, f func_to_be_bound);
另一个可能的形式是这样:
template <class F, F f> R bind1st(A2 a2) { retrun f(a1, a2); }
这种形式中 f 是一个非类型的模板参数。如果 F 是一个指针类型的话, f 就是一个指针,也能算是整型的非模板参数,所以这样的形式是接受的。问题在于调用须以这样的形式进行:
bind1st(a2_arg);
和之前的bind1st的用法差别甚大。或许可以尝试写一个辅助函数来简化:
template <class F> R bind1st_aux(F f) { return &(bind1st<F, f>); }
然而这种方式实际使用中会产生编译错误,因为模板的实例化参数使用了函数参数。函数参数的值是在运行期才能决定的,而模板则要求在编译期完成实例化。
而且上面那样的函数模板无法接受非整型的函数对象作为模板参数,除非把函数对象定义为全局变量,并将函数对象的地址作为参数传入。局部变量因为储存在栈区,地址取决于栈的使用状况,故只能在运行期判明,不能用作模板参数(我认为理论上静态变量也是可以的,因为都是储存在静态区,地址是可以在编译期决定的。不过在gcc 3.4.5上只有使用全局对象时编译才能通过)。
暂时能想到的用普通函数指针来实现会存在的问题就这些,似乎对于普通函数指针来说限制是比较多的。如果哪位有用普通函数指针的不错的实现的话,请告诉我吧!
另外,这不知道算不算是函数对象比普通函数要灵活的一个例子呢?
>back<