我想自己翻译The C++ Programming Language 3e

arya 2002-04-05 04:14:08
就是最经典的那本。本来听说裘翻了, 就想看看如何。但是听说裘犯了把inline翻成"在线"这种低级错误,还在chinaclub上振振有词地辩解。令我十分失望。下面我把我翻的一段展示,大家看看有没有戏。

13.2 一个简单的字符串模板
考虑一串字符。字符串是一个类,它持有字符,并提供如”下标运算”,”连接”和”比较”这些一般被认为和一个“串”的概念相关的操作。我们希望为各种各样的字符提供这些行为。例如,符号字符串,无符号字符串,汉字串,希腊字符串,等等,这些在不同的背景下是有用的。于是,我们就想以对某种特殊类型的字符的最小依赖方式来表达“串”的概念。串的定义依赖于一个字符可以被复制这件事,以及少数其它事实。因此,我们就可以把§11.12中的字符串拿来并把字符类型换成一个参数,如此就得到一个更一般的串类型:
template<class C> class String {
struct Srep;
Srep *rep;
public:
String();
String(const C*);
String(const String&);
C read(int I) const;
// …
};
template <class C>这个前缀指示一个模板正被声明,而一个参数类型C将用于定义当中。经过这番介绍,C就可以象其它类型名字完全一样地使用了。C的范围延伸到以template <class C>为前缀的声明末尾。注意,template <class C>说的是C是一个类型名,它不必是一个类的名字。
类模板的名字,后面附带用<>括起来的类名,就是一个(由模板定义的)类名字,而且它用起来完全和其它类名字一样。例如:
String<char> cs;
String<unsigned char> us;
String<wchar_t> ws;

class Jchar {
// Japanese character
};
String<Jchar> js;

除了名字上的特殊语法,String<char>完全如同它在§11.12中的类String定义一样。把String做成模板,使得我们能为任意类型的字符串提供我们已为char字符串提供的便利。例如,假如我们使用标准库里的map和String模板,§11.8中的单词计数例程就变成:
int main() //统计输入中每个单词的出现次数
{
String<char> buf;
Map<String<char>, int> m;
While (cin>>buf) m[buf]++;
// 这里输出结果
}
于是我们的日文字符串的版本就成了:
int main() //统计输入中每个单词的出现次数
{
String<Jchar> buf;
Map<String<Jchar>, int> m;
While (cin>>buf) m[buf]++;
// 这里输出结果
}
标准库提供类似于模板化的String类的模板类basic_string。在标准库里,string被定义成basic_string<char>的同义词:
typedef basic_string<char> string;
这就使得我们可以这样写单词计数程序:
int main() // 统计输入中每个单词的出现次数
{
string buf;
Map<string, int> m;
While (cin>>buf) m[buf]++;
// 这里输出结果
}
typedef通常用来缩写由模板生成的长长的类名字。而且,我们通常更宁愿不去了解如何定义一个类型的细节,而typedef让我们隐藏类型是从模板中生成的事实。
...全文
80 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
anjiaosj007 2002-04-09
  • 打赏
  • 举报
回复
支持
Fnoopy 2002-04-07
  • 打赏
  • 举报
回复
支持!

594

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧