登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

秒大刀 博客

好好学习 天天向上

 
 
 

日志

 
 
 
 

代理类解决“函数重载”  

2009-04-17 12:00:56|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

    来自于《More Effective C++ Item M30》的代理类非常的神奇,除了在处理多维数组、operator[]等问题之外,这种延迟处理技术也能在其他地方找到其恰如其分的应用。本例将展示如果用代理类避免对传入参数为const char*或const std::string&的函数进行重载。

    我需要实现一个函数void f(const char* str),该函数底层可能需要调用C库,所以将参数设计成char*而不是std::string&。但为了在上层方便的兼容std::string而不用每次都写上c_str()可能需要重载void f(const std::string& str){f(str.c_str());},这个是通常的解决方案,也非常的直观优美。

    但如果有很多个这种f,每个都去写一份不痛不痒的重载世界就不那么优美了。有没有一种机制能自动的将std::string转换成char*?

  class StringProxy
  {
      const char* m_str;
  public:
      StringProxy() : m_str(NULL){}
      StringProxy(const char* str) : m_str(str){}
      StringProxy(const std::string& str) : m_str(str.c_str()){}
  public:
      inline operator const char*() const {return m_str;}
      inline const char* c_str() const {return m_str;}
  };
  inline std::ostream& operator<<(std::ostream& os, StringProxy data)
  {
      os << data.c_str();
      return os;  
  }  

    通过StringProxy这样一个代理类即可实现const char*和const std::string&的殊途同归。这样一来,f的前面即可写为:void f(StringProxy str);。一个临时的StringProxy对象会将字符串类型统一,上层使用时可以方便的传入各自的参数类型,下层使用时只用考虑const char*。

    问题解决!

 

相关日志:读《More Effecive C++ 中文版》

  评论这张
 
阅读(742)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018