中国开发网: 论坛: 程序员情感CBD: 贴子 249503
holly: C++0x 设计 (8)
一个例子:
支持 Generic 编程
考虑这个代码:

template<class T> class vector {
// ...
void push_back(const T&) { /* _ */ }
// ...
};
vector<double> v;
v.push_back(1.2);
v.push_back(2.3);
v.push_back(3.4);

这是一个很基本的使用模板和 STL 的例子. 从这样的大量实践和试验中, 我们可以看到所涉及到的语言功能和编程技术是成功的和令人惊讶地灵活的, 请参看 STL 和 Boost 作为样例. 特别地, 在性能是基本要求的时候, 模板的使用已经成为标准的做法了. 那么, 我们在 C++0x 上如何做得更好? 所谓 "更好" 我指的是扩展那些能被优雅地表现的东西, 并且与 C++98 相比没有性能上损失, 以及对现有缺陷的修正. 特别地, 这个 vector 例子能够被增强吗? 重复的 push_back() 看上去很多余而且丑陋, 缺乏元素类型的规格说明是一个弱项, 容易导致大量难看的错误信息, 而且, 理想化地说, 我不想暴露出 push_back() 的实现. 一个更好的版本象这样:

template<Value_type T> class vector {
// ...
void push_back(const T&); // just the declaration
// ...
};
vector<double> v;
v.push_back(1.2);
v.push_back(2.3);
v.push_back(3.4);

用来指明元素类型 T 的 Value_type 是一个 "concept"; 它指明了 vector 可以对 T 作什么样的假设. 如果我们能够验证 double 是一个 Value_type, 我们就可以对 v 的定义作类型检查, 而不需要看到 push_back 的定义. 如果我们想要 inline 那么我们会需要 push_back() 的定义. 但那是一个实现细节而已. Concepts 能给予我们分离的转换单元的检查, 而不需要利用模板参数的类型层次, 或者对模板用户进行惩罚.

我们怎样来消除对 push_back() 的重复调用呢? 我们可以允许 vector 带有一个初始化列表作为它的参数. 这需要定义一个带有这样一个初始化列表的构造函数. 例如:

template<Value_type T> class vector {
// ...
vector(const T*, const T*); // sequence constructor
// ...
};
vector<double> v = { 1.2, 2.3, 3.4 };

concepts 和通用的初始化列表的设计细节还在激烈的讨论中. 这里列出的并非细节, 而是我认为的 C++0x 中应该会有的这些功能.


会怎么样呢?

我认为 C++0x 会清楚地反映这里概述的最佳策略. 由于资源的缺乏 (时间, 人手以及喜好) 限制了我们能做的, 而且显然 (在这样一个巨大而复杂的任务上), 我们会犯一些错误. 一些 "随机的扩展" 也会溜到网上并变成语言中 "奇怪的和被隔离的" 特性 (很象 C 和 C++ 中的枚举类型). 不管怎样, 我们有理由期望 C++ 0x 会在目前的 C++ 上有一个显著的增强, 为了它的用户们和更多的正在和即将到来的用户.

参考

[1] "Standard for the C++ Programming Language," ISO/IEC 14882.
[2] The C++ Standard (ISO/IEC 14882:2002), Wiley, 2003. ISBN 0-470-84674-7.
[3] Stroustrup, B. The Design and Evolution of C++, Addison-Wesley, 1994. ISBN 0-201-54330-3.
[4] Stroustrup, B. "Learning Standard C++ as a New Language," C/C++ Users Journal, May 1999 (http://www.research.att.com/~bs/ papers.html).
[5] Stroustrup, B. The C++ Programming Language, Special Edition, Addison-Wesley, 2000. ISBN 0-201-70073-5.
[6] "Technical Report on C++ Performance," ISO.IEC PDTR 18015 (http://www.research.att.com/~bs/C++.html).
[7] "Technical Report on C++ Standard Library Extensions," ISO/IEC PDTR 19768.
[8] http://www.boost.org/.
[9] Stroustrup, B. "C and C++: Siblings," "C and C++: A Case for Compatibility," and "C and C++: Case Studies in Compatibility," C/C++
Users Journal, July/August/September, 2002 (http://www.research.att.com/~bs/papers.html).
若你在年轻时上过水木, 它会一生跟随着你, 如一场浮动的盛宴

禁色和禁果仍被保存吗?
这世界有否给潜移默化?
离过家回了家仍住中环吗?
-----信有带到新居里烧吗?

一切美好的都会消失

人要是没有理想, 跟咸鱼有什么两样?

“把人们引向艺术和科学的最强烈动机之一,是要逃避日常生活中令人厌恶的粗俗和使人绝望的沉闷,是要摆脱人们自己反复无常的欲望的桎梏。一个修养有素的人总是渴望逃避个人生活而进入客观直觉和思维的世界。”

不要忘了,这个世界穿透一切高墙的东西,它就在我们的内心深处,他们无法达到,也接触不到,那就是希望。(FROM《肖申克的救赎》)

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录