当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

<b>奇技淫巧C++之返回值重载</b>[VC/C++编程]

赞助商链接



  本文“<b>奇技淫巧C++之返回值重载</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

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));
}

  以上是“<b>奇技淫巧C++之返回值重载</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .