C++中函数对象之函数适配器的bind2nd问题

Enockipp 2014-03-31 07:26:16
在学函数适配器时,我参考了cplusplus.com的reference,感觉里面有一处不是很明白:
为什么 binder2nd的value成员不声明为引用,不用引用,肯定会有复制构造,如果用引用这次复制是可以避免的啊。而且binder2nd的构造函数使得second_argument_type本身不能是引用。
本人菜鸟,欢迎各位回答:

下面是cplusplus.com的标准库,bind2nd和binder2nd代码:


template <class Operation, class T>
binder2nd<Operation> bind2nd (const Operation& op, const T& x)
{
return binder2nd<Operation>(op, typename Operation::second_argument_type(x));
}

template <class Operation> class binder2nd
: public unary_function <typename Operation::first_argument_type,
typename Operation::result_type>
{
protected:
Operation op;
typename Operation::second_argument_type value;
public:
binder2nd ( const Operation& x,
const typename Operation::second_argument_type& y) : op (x), value(y) {}
typename Operation::result_type
operator() (const typename Operation::first_argument_type& x) const
{ return op(x,value); }
};
...全文
278 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoyowinwin 2014-04-03
  • 打赏
  • 举报
回复
别用binder2nd这个被废弃的函数了,用C++11里的bind吧
Enockipp 2014-04-03
  • 打赏
  • 举报
回复
引用 9 楼 FrankHB1989 的回复:
[quote=引用 8 楼 xhu_eternalcc 的回复:] [quote=引用 5 楼 FrankHB1989 的回复:] [quote=引用 3 楼 xhu_eternalcc 的回复:] [quote=引用 2 楼 taodm 的回复:] 因为当年写stl的时候,那些“大牛”在模板方面其实都是菜鸟。 这个bug一直到boost库出来才解决的。 所以,果断用boost库的bind,不要用stl的adaptor
多谢~ 好像是啊,我想先学学stl adaptor,然后再boost[/quote] 已经deprecated掉了,不怎么有必要学。[/quote] 恩,打算看boost了,以前稍微看过点boost[/quote] 建议先看C++11的std::bind。 boost的东西某种意义上更多点。[/quote] 嗯,整了本boost程序库完全开发指南第2版,里面全是C++11的语法,看着好不习惯,还是换本第一版
Enockipp 2014-04-03
  • 打赏
  • 举报
回复
引用 10 楼 waynebuaa 的回复:
别用binder2nd这个被废弃的函数了,用C++11里的bind吧
嗯,C++11的新语法有点不习惯啊,项目里也不能用C++11,看了不用很快又忘
FrankHB1989 2014-04-02
  • 打赏
  • 举报
回复
引用 8 楼 xhu_eternalcc 的回复:
[quote=引用 5 楼 FrankHB1989 的回复:] [quote=引用 3 楼 xhu_eternalcc 的回复:] [quote=引用 2 楼 taodm 的回复:] 因为当年写stl的时候,那些“大牛”在模板方面其实都是菜鸟。 这个bug一直到boost库出来才解决的。 所以,果断用boost库的bind,不要用stl的adaptor
多谢~ 好像是啊,我想先学学stl adaptor,然后再boost[/quote] 已经deprecated掉了,不怎么有必要学。[/quote] 恩,打算看boost了,以前稍微看过点boost[/quote] 建议先看C++11的std::bind。 boost的东西某种意义上更多点。
CyberLogix 2014-04-01
  • 打赏
  • 举报
回复
引用 2 楼 taodm 的回复:
因为当年写stl的时候,那些“大牛”在模板方面其实都是菜鸟。 这个bug一直到boost库出来才解决的。 所以,果断用boost库的bind,不要用stl的adaptor
taodm说的太对了,呵呵!
FrankHB1989 2014-04-01
  • 打赏
  • 举报
回复
引用 3 楼 xhu_eternalcc 的回复:
[quote=引用 2 楼 taodm 的回复:] 因为当年写stl的时候,那些“大牛”在模板方面其实都是菜鸟。 这个bug一直到boost库出来才解决的。 所以,果断用boost库的bind,不要用stl的adaptor
多谢~ 好像是啊,我想先学学stl adaptor,然后再boost[/quote] 已经deprecated掉了,不怎么有必要学。
Enockipp 2014-04-01
  • 打赏
  • 举报
回复
引用 5 楼 FrankHB1989 的回复:
[quote=引用 3 楼 xhu_eternalcc 的回复:] [quote=引用 2 楼 taodm 的回复:] 因为当年写stl的时候,那些“大牛”在模板方面其实都是菜鸟。 这个bug一直到boost库出来才解决的。 所以,果断用boost库的bind,不要用stl的adaptor
多谢~ 好像是啊,我想先学学stl adaptor,然后再boost[/quote] 已经deprecated掉了,不怎么有必要学。[/quote] 恩,打算看boost了,以前稍微看过点boost
Enockipp 2014-04-01
  • 打赏
  • 举报
回复
引用 6 楼 OExpress 的回复:
[quote=引用 2 楼 taodm 的回复:] 因为当年写stl的时候,那些“大牛”在模板方面其实都是菜鸟。 这个bug一直到boost库出来才解决的。 所以,果断用boost库的bind,不要用stl的adaptor
taodm说的太对了,呵呵![/quote] 多谢回复
Enockipp 2014-03-31
  • 打赏
  • 举报
回复
引用 1 楼 bluesky12312388 的回复:
如果binder2nd的value为引用,可能造成reference to reference的问题。 参考http://zohead.com/archives/cplusplus-bind2nd-reference/
这个我知道,我问题里已经说出了,不过还是谢谢
Enockipp 2014-03-31
  • 打赏
  • 举报
回复
引用 2 楼 taodm 的回复:
因为当年写stl的时候,那些“大牛”在模板方面其实都是菜鸟。 这个bug一直到boost库出来才解决的。 所以,果断用boost库的bind,不要用stl的adaptor
多谢~ 好像是啊,我想先学学stl adaptor,然后再boost
taodm 2014-03-31
  • 打赏
  • 举报
回复
因为当年写stl的时候,那些“大牛”在模板方面其实都是菜鸟。 这个bug一直到boost库出来才解决的。 所以,果断用boost库的bind,不要用stl的adaptor
bluesky12312388 2014-03-31
  • 打赏
  • 举报
回复
如果binder2nd的value为引用,可能造成reference to reference的问题。 参考http://zohead.com/archives/cplusplus-bind2nd-reference/

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧