Tuples Herb Sutter

就像我上期所报道的一样,在2002十月标准会议上,两个库扩展作为标准库延深,而被通过。

1 是Doug Gregor’s提出的多态函数的object wrappers。

2 Jaakko Järvi's提出的tuple类型。

这两个都是直接来在Boost项目。(Boost项目是一个C++ libraries 集合)上次,我答应在这期和下一期将介绍这两个扩展的库,这个月,就让我来简单的介绍一下tuple类型。

Tuple Types:一个简单Motivating例子

假如你想用一个函数返回多于一个返回值,例如:

// yields a quotient only
//
int IntegerDivide( int n, int d ) {
return n / d;
}
// Sample use:
cout << "quotient = " << IntegerDivide( 5, 4 );

在这个实现中有什么错误吗? 也许没有,毕竟在编译器中,我们内嵌了整数除法。包括结果也能够四舍五入。

但是,如果我们想做更多。特别,想提供一个方法得到除法其他的信息,例如除法的余数。如果没有改变函数的结构。那么,实现这样的要求的函数不是一件容易的事情。

一种办法我们在函数中加入一个输出变量。

// Example 1(b): Integer division,
// yielding a quotient and remainder,
// one as the return value and one via
// an output parameter
//
int IntegerDivide( int n, int d, int& r ) {
r = n % d;
return n / d;
}
// Sample use:
int remainder;
int quotient = IntegerDivide( 5, 4, remainder );
cout << "quotient = " << quotient
<< "remainder = " << remainder;

这个方法的实现比较,但是我们经常这么实现。这种通过返回值和输出变量来返回函数返回值的办法,看起来有点不可思议。有人也许会说下面的办法更好。

// Example 1(c): Integer division,
// yielding a quotient and remainder,
// this time via two output parameters
//
void IntegerDivide( int n, int d, int& q, int& r ) {
r = n % d;
q = n / d;
}
// Sample use:
int quotient, remainder;
IntegerDivide( 5, 4, quotient, remainder );
cout << "quotient = " << quotient
<< "remainder = " << remainder;

这种办法也许更加协调。但是 还是比较含糊,不令人满意。稍微想一想,我们会记得为什么:Ralph Waldo Emerson建议我们:“一个愚笨的一致性的想法是思想混乱的怪物”(a foolish consistency is the hobgoblin of little minds)。这个版本能够正常工作,但是,如果你认为它不稳定的话,我不会责怪你。

那么该怎么做呢?在这一点我们通常会想起在标准库中我们有一个工具:std::pair,毕竟在标准模板库中有很多函数可以返回几个值 ,iterator范围就是作为一个单独的值-同时,大多通过pair<iterator,iterator>实现的,同样的方法能够运行,如下:

// Example 1(d): Integer division,
// yielding a quotient and remainder,
// this time both in the return value
//
std::pair<int,int> IntegerDivide( int n, int d ) {
return pair<int,int>( n/d, n%d );
}
// Sample use:
pair<int, int> quot_rem = IntegerDivide( 5, 4 );
cout << "quotient = " << quot_rem.first
<< "remainder = " << quot_rem.second;

可以看出这是一个满意的做法,同时,它还可以提高。

时间: 2024-08-02 17:03:50

Tuples Herb Sutter的相关文章

15th Annual Jolt Product Excellence &amp;amp;amp; Productivity Awards

excel Books: GeneralJolt Winner:• Head First Design Patterns by Elisabeth Freeman, Eric Freeman, Bert Bates and Kathy Sierra (O'Reilly)Productivity Winners:• Joel on Software by Joel Spolsky (Apress)• Refactoring to Patterns by Joshua Kerievsky (Addi

关于对象生命历程的会话

(译者注:我从网上看到这篇文章的原文,非常喜欢作者的写作风格,于是就利用业余时 间将它翻译出来,并贴到网上,希望大家可以从中受益,因为我没有和作者或者这篇文章的 版权所有者联系以取得这篇文章的版权,所以这篇中译文的版权不应归我所有,而且我未从 中获得任何利益!而且,我对原作者及其版权所有者的敬仰有如涛涛江水,所以我绝没有侵 犯原作者的任何意图.当然,要说"利益"还是有的,就是我加深了如下C++的知 识:只能被绑定到一个常量的.非易失的引用上,左值却没有这样的限制:函数返回的引用是 左值

C++/CLI中栈对象的设计问题

C++/CLI中新推出的自动确定性资源回收(Automatic deterministic destruction)被视 为一个优秀的设计.是使用所谓C++/CLI这个"新瓶"来装Bjarne Stroustrup提 出的RAII这个"旧酒". 这的确不错,相对而言,这个比C#中的using 关键字(dispose模式),以及Java中的 hard-coded的dispose方法都要好许多.这个特性是由C++/CLI中栈对象(局部对象)来提供 的,局部对象本身没错,

完美的C++:C++/CLI

什么是C++/CLI呢?C++当然指的是Bjarne Stroustrup在BELL实验室发明的C++语言,它实现了运行时取得速度和尺寸最佳化的静态对象模型,然而它除了堆分配外不支持程序的动态修改,它准许无限地接近底层设备,但在程序运行过程中几乎无法操作活动类型,也无法操作与程序相关联的底层结构.Herb Sutter,C++/CLI的主要构造者之一,称C++是一门"混凝土"式的语言. CLI指的是通用语言结构,一种支持动态组件编程模型的多重结构,在许多情况下,这代表了一个与C++对象

C++:最强大的.NET语言之装箱

再论类型 在讨论装箱(boxing)之前,有必要弄清楚为什么值类型与引用类型之间会有所区别. 一个含有数值的值类型的实例,和一个指向对象的引用类型的实例,它们有什么区别呢?除了存储对象所需的内存之外,每一个对象都会有一个对象头,目的是为面向对象的编程提供基本的服务,如存在虚方法的类,嵌入其中的元数据等等.由虚方法和接口间接结合的对象头,其内存开销通常会很大,哪怕你所需要的只是一个静态类型的数值,也会带来一些编译器的强制操作.有趣的是,在某些情况下,编译器能优化掉一些对象开销,但不总是能起作用.如

Java开发2.0: Kilim简介

一种用于实现 Java 并发性的角色框架 简介:并发编程是 Java 开发 2.0 的核心概念,但可能不是基于线程的并发性.Andrew Glover 解释为什么在多核系统中进行并发编程时,角色优于线程.他然后介绍 Kilim -- 一种基于角 色的消息传递框架,结合了并发编程和分布式编程. 对于软件开发人员而言,调试多线程应用程序中的非确定缺陷是最痛苦的工作.因此,像大多数人一 样,我钟爱使用 Erlang 和 Scala 等函数语言进行并发编程. Scala 和 Erlang 都采用了角色模

C++中禁止异常信息传递到析构函数外

在有两种情况下会调用析构函数.第一种是在正常情况下删除一个对象,例如对象超出了作用域或被显式地delete.第二种是异常传递的堆栈辗转开解(stack-unwinding)过程中,由异常处理系统删除一个对象. 在上述两种情况下,调用析构函数时异常可能处于激活状态也可能没有处于激活状态.遗憾的是没有办法在析构函数内部区分出这两种情况.因此在写析构函数时你必须保守地假设有异常被激活,因为如果在一个异常被激活的同时,析构函数也抛出异常,并导致程序控制权转移到析构函数外,C++将调用terminate函

Effective C#原则45:选择强异常来保护程序

当你抛出异常时,你就在应用程序中引入了一个中断事件.而且危机到程序 的控制流程.使得期望的行为不能发生.更糟糕的是,你还要把清理工作留给最 终写代码捕获了异常的程序员.而当一个异常发生时,如果你可以从你所管理的 程序状态中直接捕获,那么你还可以采取一些有效的方法.谢天谢地,C#社区不 须要创建自己的异常安全策略,C++社区里的人已经为我们完成了所有的艰巨的 工作.以Tom Cargill的文章开头:"异常处理:一种错误的安全感觉, " 而且Herb Sutter,Scott Meyer

开发者是否该学习C++语言

随着C++ 11和C++ CX的引入,很多人重新燃起了对这门语言的兴趣.不少开发者,尤其是Windows开发者,都想知道是否应该放弃C#和Java,转而支持C++.John Sonmez认为这并不需要. 在"为什么C++并没有'王者归来'(Why C++ Is Not 'Back')"一文中,John Sonmez认为只有如下三个原因才会使用C++: ● 需要榨干软件每一寸可能的性能,并且想用支持面向对象抽象的语言来实现. ● 编写直接面对硬件的代码.(例如,编写底层驱动.) ● 内存