来自于《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*。
问题解决!
评论