当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 在常规的编程任务中使用新的 <tuple> 库

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 在常规的编程任务中使用新的 <tuple> 库


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 69 ::
收藏到网摘: n/a

在常规的编程任务中使用新的 <tuple> 库

作者:Danny Kalev
编译:MTT 工作室

原文出处:Tackle Common Programming Tasks Using the New <tuple> Library

摘要:Tuples 是大小固定的异构对象集合,它正在被添加到 C++ 标准。学习这种强大的数据类型有助于简化一些常规的编程任务。


  C++ 标准委员会目前正在进行标准库的更新和增强。Tuple 类型是最近添加到 C++ 标准中的内容之一。Tuple 是一个大小固定的异构对象集合。Tuple 类型非常强大,它有助于简化一些常见的编程任务。
  本文代码所依赖的常规编译器均支持 C++ 98 规范,但是目前<tulpe>库还并不一定是 IDE 标准库的一部分。因此,要想使用这个库必须到 Boost 下载并安装。但今后的大多数开发环境肯定都会支持<tuple>库的。

如何模拟从一个函数中返回多个类型?如何同时进行多个值的赋值和比较?
 
使用 <tuple> 库定义 tuple 对象并处理之。

1、构造和初始化
  tuple 类型 tuple 类模板的特化或实例。目前的标准库支持 0-10个元素的 tuple。每个元素可以有不同的类型。在下面的例子中,t 被定义为 tuple 类型,它包含两个元素,类型分别为 int 和 double:

#include <tuple>tuple <int, double> t(1, 3.14);

  为简单起见,我不使用名字空间的限定。tuple 所在的实际名字空间及其辅助函数是根据所使用的库声明的。Boost 库在 boost::tuples 中声明 tuple。 标准 C++ 通常会在 std 中声明。
如果你省略初始化例程,那么将应用默认的初始化替代:

tuple <std::string, int*> u; //initialized to: string(),0

2、辅助函数
  为了得到 tuple 的元素个数,使用 tuple_size():

int sz=tuple_size <tuple <int, const double, std::string> >::value;//3

make_tuple() 用于构造 tuple 类型。该函数按照其参数创建一个 tuple 类型:

void f(int i);T1=make_tuple(&f); // returns: tuple<void (*)(int)>T2=make_tuple("hi", 2); // tuple< const char (&)[3], int>

tuple_element() 函数返回单个元素的类型。该函数以索引和 tuple 类型为参数:

//获得第一个元素的类型T=tuple_element <0, tuple<int, int, char> >::type;//int

  如果你需要存取实际的元素,而非类型,那么就用 get<N>() 函数。注意 tuple 使用基于 0 的索引。

tuple <int, double> t;int n=get<0>(t); //获得第一个元素get<1>(t)=0.5; //给第二个元素赋值 

3、现实世界中的 tuple
  下面让我们考察一下 tuple 类型的应用,假设你需要实现这样一个函数:将某个文件名转换为FILE * 和文件描述符。大家知道,C++ 不允许一个函数返回多个类型的值。通常的做法是定义两个名字稍有差别的函数来解决这个问题的,例如:

int convert_filename(const char * path);FILE * fconvert_filename(const char * path);

  POSIX 库充满了这样的函数集。在这种情况下是不会用重载机制的,因为你无法定义仅有返回值不同的函数的重载版本。例如:

int convert_filename(const char* path);FILE* convert_filename(const char* path); //出错

  通过使用 tuple 类型来包装两个返回类型,你可以模拟单个函数返回多个类型。像往常一样,使用 typedef 来隐藏繁琐的语法:

typedef tuple<int, FILE *> file_t;file_t convert_filename(const char* path);

在面向对象环境中,你也可以扩展 file_t 为一个适合的 fstream 对象。
  tuple 提供了一个优雅的解决方案来解决另外一个问题,就是用整型来仿真浮点值。现在你可以借助 tuple 用两个纯粹的整型替代:

typedef tuple<__int64, int> Currency;

例如,有一个 USD 类:

class USD{private: Currency