重载类型转换符

C++ 程序员都知道重载运算符:

   1: operator++

   2: operator==

   3: operator>>

比如C++ 中的输入输出:

   1: cout<<"Hello World!"<<endl;

   2: cin>>&value>>endl;

 

实际上就是重载了”>>” 和”<<”  运算法,但如果说重载类型转换符,可能不是所有的程序员都用到过,最近写一个配置文件的类就碰到了这样的问题。我希望使用 template<class T> T Config::string_to_T(const string& s) 函数返回指定类型的参数,T 类型由调用string_to_T() 的函数确定。比如:

   1: template<class T> T Config::Read(const string& key, const T& value)const{

   2:     ....from key we get value...

   3:     return string_to_T<T>(value);

   4: }

下面是我写的代码:

   1: template<class T> T Config::string_to_T(const string& s){

   2:     T t;

   3:  

   4:     istringstream ist(s);

   5:     ist >> t;

   6:  

   7:     return t;

   8: }

这段代码在大部分时候是没有问题的。

   1: int port

   2: port = Read("port", 0) \\返回了int 类型的端口号

   3: string ip

   4: Read("ip", ip)         \\返回了string 类型的ip 地址

但在T 类型为string 类型的时候,如果s 中包含了空格,那么返回的string 类型只包含了string value 的一部分。比如:

   1: str num_list

   2: port = Read("nums", num_list) \\num 如果对应的值是"1 2 3 4",那么则只返回 1

这是因为ist >> t 格式化输出到T t,当遇到有空格时会将string 分开输出。

解决方法也非常简单,就是的当类型为string 时直接返回,当不是string 类型时,通过上面的string_to_T() 方法即可,这就需要重载类型转换符,代码如下(operator std::string()const  和template<template T> operator T()const 分别重载了string() 和T() 类型转化符):

   1: class ToStringHelper

   2: {

   3:     std::string myValue;

   4: public:

   5:     ToStringHelper( std::string const& value )

   6:         : myValue( value )

   7:     {

   8:     }

   9:     operator std::string() const

  10:     {

  11:         return myValue;

  12:     }

  13:     template <typename T>

  14:     operator T() const

  15:     {

  16:         std::istringstream cvt( myValue );

  17:         T results;

  18:         cvt >> results;

  19:         //  Error checking here...

  20:         return results;

  21:     }

  22: };

  23:  

  24: ToStringHelper

  25: string_to_T( std::string const& s )

  26: {

  27:     return ToStringHelper( s );

  28: }

 

我的提问stackoverflow:http://stackoverflow.com/questions/13658667/how-can-i-return-a-string-as-a-template-class-in-c/

如何定制自己的color scheme

在vim 配置文件vimrc 中通过colorscheme 命令可以选择自己喜欢的配色方案,在vim 下输入

:colorscheme torte

既可以选择系统自带torte 配色方案,当然你也可以在vim.org 下载自己喜欢的配色方案,在debian 中用户的配色方案放置在/usr/share/vim/vim72/colors/ 目录下。每个配色方案都是一个单独的vim 文件,比如很多vim 用户喜欢用的desert.vim ,但我觉得这样的配色太花哨了,torte 更适合我。所以如果想定制自己的vim 颜色方案可以看看下面的内容。

继续阅读

系统论文的结构

源地址:http://www.cs.ucr.edu/~michalis/TECHWRITING/structure.html

一些原则:

  1. 递归性:section 的第一段应该是该section 的一个总结(summary/overview)。你可以这样开始“In this section, we present …”。
  2. 递归性:在每段中,第一句(或者第二句)应该是该段的总结(summary)。
  3. 自顶向下:从最顶层缓慢介绍细节。
  4. 让读者有准备:论文不是悬疑惊悚片,读者应该有个大概思路你要往那走。
  5. 适应性:这些原则起指导作用。但不同的文章有不同的要求。当你破坏了一些原则的时候,你应该意识到这点,并具有充分的理由。
  6. 忌讳:庞大的引言:如果你的引言超过了1.5 页纸,那么你可能思路还不清晰,或者你的摘要有问题。
  7. 注意:你可以破坏所有的原则,但你也会为之付出代价的。

继续阅读

如何写篇好的系统文章[译]

原文How (and How Not) to Write a Good Systems Paper

写在之前:本文最早出现在ACM SIGOPS Operating Systems Review, Vol. 17, No. 3 (July, 1983), pages 35-40. 作为USENIX 推荐的写作指南对刚动手写论文的写手应该有好的借鉴作用。

一、引言

1983 年 3月 21日,第九届操作系统原理研讨会(SOSP)收到83 篇论文,经过阅读后收录了其中的16 篇作为会议论文发表。录用比率约为1/5 ,虽然收到的论文数量较前几年少,但和往年的会议录用率相近。会议委员会许多成员都发现非常容易分开好的文章和差的文章;的确,十个委员对80% 的论文的处理很快就做出了决定。考虑到接受率,其中大部分文章都被拒绝了。

在进行完会议论文的筛选工作,一些委员表现了对提交论文整体质量的失望。许多被拒的文章表现出类似的弱点,会议委员们认为这些弱点对于作者应该是显而易见的。抱着提高之后SOSP 会议提交文稿、以及更普遍的系统论文的质量,程序委员会决定对收到的论文采用一个标准进行评估。本文将结合委员会所有成员所使用的标准,而不只是作者的。

为了避免冠冕堂皇的说教,我们使用一种启发性、偶尔幽默的方式,以第一、第二人称来陈述。但是,文章的目的却是很严肃的:指出科技论文中不断重复的常见问题,以帮助以后写手们(作者)不再范同样的问题。当你阅读这篇文章的时候,假设你将为第十届SOSP 会议或者TOCS 会议投稿。你在发表之前已经做了一些工作,所以你坐下来开始写一篇文章。当你写的时候你应该问自己哪些问题呢?而这些也是我们检查你的论文将提出的,并决定你的论文是否被发表的问题。

继续阅读