
奇技淫巧C++之返回值重载
发布时间:2006-08-07 09:36:38 来源:blog 网友评论 0 条
C++当然是不能仅仅通过返回值重载函数的,但是,我们往往会想:要是支持返回值重载就好了。现在,我就从C++的某个颇受争议的角落,为您发掘一点东西。
假设有这样一个函数:
可是,DBField实际的数据类型对于getvalue来说,并不了解,一个常见的解决方案是:
可是,这样当然是一个办法,而且是不错的办法。问题在于,有些时候我们并不方便提供这个T,比如,是一个运算符重载的时候。另外,当我们不想过早确定返回值类型的时候,我们也不愿意提供这个类型T。解决的办法很简单,提供一个间接层:
看看如何实现Result:
现在,让我们输出数据:
如下使用:
当然,把类型写进名字可不是什么漂亮的做法,既然你喜欢重载,没问题:
这个方法问题在于,必须在某个结束点提供具体的类型信息,这也是为什么我们要写两个print而不是直接用cout输出的原因。可是,话说回来,既然你打算仅仅通过返回值来重载,总要告诉代码,返回值是什么吧?
这里展示了懒惰计算的技巧,通过一个间接层,把真正的计算时刻延迟到必需的时候。也许你对返回值重载不屑一顾,但是这个技巧是非常有用的。下一次,我将用懒惰计算的方法,展示另一种技巧。
假设有这样一个函数:
| type getvalue(const DBField& fd); |
可是,DBField实际的数据类型对于getvalue来说,并不了解,一个常见的解决方案是:
| template<typename T> T getvalue(const DBField& fd); |
可是,这样当然是一个办法,而且是不错的办法。问题在于,有些时候我们并不方便提供这个T,比如,是一个运算符重载的时候。另外,当我们不想过早确定返回值类型的时候,我们也不愿意提供这个类型T。解决的办法很简单,提供一个间接层:
| string getvalue(const DBField& fd); int getvalue_int(const DBField& fd); Result getvalue(const DBField& fd) { return Result(fd); } |
看看如何实现Result:
| struct Result{ const DBField& fd; explicit Result(const DBField& f) : fd(f){} operator string() const { return getvalue_string(fd);} operator int() const { return getvalue_int(fd);} }; |
现在,让我们输出数据:
| void print_string(const string& str){...} void print_int(int i){...} |
如下使用:
| print_string(getvalue(DBField)); print_int(getvalue(DBField)); |
当然,把类型写进名字可不是什么漂亮的做法,既然你喜欢重载,没问题:
| template <typename T> T getvalue(const DBField& fd); struct Result{ const DBField& fd; explicit Result(const DBField& f) : fd(f){} template<typename T> operator T() const { return getvalue<T>(fd);} }; |
这个方法问题在于,必须在某个结束点提供具体的类型信息,这也是为什么我们要写两个print而不是直接用cout输出的原因。可是,话说回来,既然你打算仅仅通过返回值来重载,总要告诉代码,返回值是什么吧?
这里展示了懒惰计算的技巧,通过一个间接层,把真正的计算时刻延迟到必需的时候。也许你对返回值重载不屑一顾,但是这个技巧是非常有用的。下一次,我将用懒惰计算的方法,展示另一种技巧。
| #include <iostream> #include <string> using namespace std; string getvalue_slow(const int&) { return "getvalue_slow"; } string g_fast = "getvalue_fast"; const char* getvalue_fast(const int&) { return g_fast.c_str(); } struct Result { const int& i; explicit Result(const int& r) : i(r){} operator string() const{ return getvalue_slow(i);} operator const char* () const { return getvalue_fast(i);} }; Result getvalue(const int& i) { return Result(i); } void print_const(const char* str) { cout << str << endl; } void print(const string& str) { cout << str << endl; } int main() { print(getvalue(1)); print_const(getvalue(1)); } |
全站资源
- 微软官方入门教程19:轻松掌握Vista系统的快
- 微软2008大冲击,预借Vista SP1力促Vista市
- 在收件箱中获得 Windows Vista 的最新更新
- 微软官方Vista入门教程全集19篇(Vista学院
- Windows Vista 的成功将势不可挡
- 快快抛弃Vista,拥抱XP SP3!你觉得呢?
- 浅谈Vista系统关闭虚拟内存与使用内存盘加速
- 嘿嘿,按下键盘上面的三个键,马上让你的Vi
- Windows Vista的盗版率只有Windows XP的一半
- 3DMark和PCMark Vantage新版将只支持Vista系
阅读排行
- Borland 发布C++ Builder 2006 RAD 环境
- C/C++程序员应聘常见面试题深入剖析
- Visual C++常用数据类型转换详解
- C++中的 static 关键字
- 利用VC++实现局域网实时视频传输
- 浅谈C/C++内存泄漏及其检测工具
- 英国投票否决C++/CLI 微软强攻ISO标准受挫
- VC++下用MSComm控件实现串口通讯
- 伪随机数生成及在VC++中的实现
- VC++编程实现对波形数据的频谱分析
最新技术文档
- C++中用赋值形式op=取代单独形式op
- C++启蒙之用C++制作程序
- C++启蒙之C++中的类
- 解析C++/CLI之头文件、内联函数与数组
- C++启蒙之控制结构
- C++启蒙之注释符号
- 了解C++异常处理的系统开支
- C++语言学习之从结构到类
- C++中理解“传递参数”和异常之间的差异
- C++中禁止异常信息传递到析构函数外
专题教程
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
- Picasa中文版_Picasa教程 专题:清除流氓软件
- Firefox专题 seo搜索引擎优化专区
- 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
