文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院程序开发C/C++奇技淫巧C++之返回值重载
精品推荐
特别推荐
·C语言编程易犯毛病集合
·C语言编程常见问题解答(目录)
·C#程序开发中的常用函数汇总
·C/C++笔试、面试题目大汇总
·Beej的网络socket编程指南
·socket编程原理
·C语言的常用库函数使用方法分析及用途
·在C语言中如何处理时间和日期
·C++设计模式之Singleton
·VC++动态链接库编程之MFC扩展 DLL
·TCP/IP网络重复型服务器通信软件的设计
·DirectX游戏开发入门
·经典与现代的结合:在MFC中集成RAD .NET框架
·Windows API-GDI入门基础知识详解(2)
·Visual C++ 入门精解
·C#基础概念二十五问
·用C#实现pdf文件的完整性验证
·成为嵌入式程序员应知道的0x10个问题
·TCP/IP编程实现远程文件传输
·几个C#编程的小技巧
热点TOP10
·学生成绩管理系统实习
·C#编写的windows计算器-源代码
·socket编程原理
·飞机订票系统设计
·C/C++笔试、面试题目大汇总
·TCP/IP编程实现远程文件传输
·Visual C++ 实现数字化图像的分割
·C语言图形函数
·C#基础概念二十五问
·改编 的 C版 职工管理系统
·C语言的常用库函数使用方法分析及用途
·用C语言实现Ping程序功能
·C#源码读取excel数据到程序中-SQL SERVER-到dataset中
·C# GridView 排序及分页
·进程调度模拟程序
·Windows下C语言网络编程快速入门
·通讯录的源代码(用链表实现)
·DirectX游戏开发入门
·在Visual Studio.NET中使用Crystal Report(上)
·asp.net中调用javascript函数实现多功能日期控件示例

奇技淫巧C++之返回值重载

日期:2007年5月2日 作者: 查看:[大字体 中字体 小字体]



  C++当然是不能仅仅通过返回值重载函数的,但是,我们往往会想:要是支持返回值重载就好了。现在,我就从C++的某个颇受争议的角落,为您发掘一点东西。

  假设有这样一个函数:

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));
}
[1] [2] 下一页 




上一篇:细谈C++多态性的“动”与“静”

下一篇:《C语言程序设计》教学的几点体会

奇技淫巧C++之返回值重载 相关文章:
·如何检测内存泄漏——重载new和delete
·点击按钮弹出新窗口,输入数据后返回并刷新页面
·Asp.net自动返回上次请求页面
·调用存储过程并且使用返回值的基本方法
·C#提交数据到服务器并返回的处理
·如何在Delphi中调用oracle的存储过程返回数据集
·动画图解:为Excel公式返回结果设置颜色
·C++运算符重载函数基础及其值返回状态
·如何让一个函数返回多个值(C#)
·教你利用Rownum来限制查询所返回的行数
奇技淫巧C++之返回值重载 相关软件:
·返回要塞
·返回首页

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.vipcn.net
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.vipcn.net All Rights Reserved. 鄂ICP备05000083号Powered by:viphot