自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 通告:告别旧帐号,新帐号 ralphjzhang

我决定迁移到新的 CSDN 帐号:ralphjzhang,并尽力完善那边的 blog,新的 blog 在http://blog.csdn.net/ralphjzhang/我会勤快一点更新这个 blog,感兴趣的朋友,可以看那边。本人对由此带来的不便深表歉意。

2007-12-19 02:24:00 3022

原创 C++ Template Metaprogramming 第九章试译: Crossing the Compile-Time/Runtime Boundary (1)

(看过了这么多编译期算法之后)还记得运行时吧?我们已经在编译期的天空飞行了好久,现在是时候脚踏实地了。一个有趣的程序终究还是要在运行时干点什么的。本章就是关于怎样穿越C++编译期和运行时的边界——这一层“臭氧层”,如果你想要的话——这样我们的元程序可以真正的用户面前施展拳脚。在C++中,进行这趟旅程的办法恐怕是无穷无尽,但是其中有一些更加有用,下面讲到的就是最常用的一些技巧。9.1 for_eac

2007-06-18 19:41:00 3965 5

原创 脱颖而出

转眼也在跨国公司工作了两年了,工作的确是一件让人成长的事情。在学生时代对很多做人处事的道理的可以津津乐道、侃侃而谈,但是知道工作了一段时间,那些道理才真正的升华成了准则,或者......教训。刚才在读杰克·韦尔奇自传,第二章“脱颖而出”。其实学生时代也读过,但却没有什么领悟,然而刚才在厕所马桶上的阅读,却让我感触良多。杰克说,他在GE的第一年,每当上面问他的意见,他总是会给出比意料之中的要多得多的

2006-02-11 08:36:00 4462 2

原创 remove_all_pointer

boost 提供了 remove_pointer ,不过不够,有的时候我们需要拿掉一个“指向指针的指针……的指针”类型上面所有的“指针”前缀,所以下面这个 remove_all_pointer 就有用了,当然它还很不完善,这里先备份,慢慢修改:#include #include #include #include #include #include #include #include #inclu

2005-11-15 22:54:00 4145

原创 Debug 命令详解

Debug  启动 Debug,它是可用于测试和调试 MS-DOS 可执行文件的程序。  Debug [[drive:][path] filename [parameters]]  参数  [drive:][path] filename  指定要测试的可执行文件的位置和名称。  parameters  指定要测试的可执行文件所需要的任何命令行信息。  ++  说明  使用 Debug 命令但不指定

2005-11-13 01:55:00 6039 1

原创 C++ local class 的用途:finalizer 手法

 在有异常的程序里面,函数的出口变得难以捉摸起来,这是大家都知道的了。但是很多时候,我们希望函数在退出之前能够一定完成某些事情,在 Java 里面,我们用 try...finally 来干这件事;而在 C++ 里面,我们有 RAII 这个好东西。不过有的时候,RAII 显得有些笨拙,如果我们希望一个函数无论如何在退出之前都要输出一个警告到控制台,难道还要为了它专门写一个类么?这不但让代码分散难于理

2005-11-12 00:58:00 5320

原创 boost.bind 如何 bind continue.1

我们先定义目标:1. simple_bind 提供与 bind 类似的界面,可以只考虑通过对象引用(或者值)调用成员函数的情况,而不考虑 free function 或者通过指针调用等等。具体地说,就是允许person.SetName("Ralph")     --> simple_bind(&Person::SetName, person,_1)(string("

2005-10-27 00:58:00 4387

原创 boost.bind 如何 bind

Boost.bind好用么?当然好用,而且它也确定进入下一代的 C++ 标准了,也早就进了 TR1 了。回顾一下,它允许我们干这个:#include #include #include #include #include using namespace std;using namespace boost;struct Person{ 

2005-10-26 08:40:00 5616 4

原创 智能指针的另外用途:optional value 手法

有些时候我们希望一个类成员除了自己的值以外,还能有一个“未被初始化”的状态,例如在一个 Server 里面,我们需要管理 user 数量:class Server{//...    int userCount_;//...};userCount_ 当然是初始化为0,但是有时候并不如此简单,很多资源可能是在第一个 user 使用的时候被分配的,而回收资源的时候,如果仅仅看到 userCount_ 为

2005-10-19 12:20:00 4318 3

原创 简单常识——关于 STL 算法

distance很多时候我们希望在一个 vector ,或者 list ,或者什么其他东西里面,找到一个值在哪个位置,这个时候 find 帮不上忙,而有人就转而求助手写循环了,而且是原始的手写循环:for ( int i = 0; i     if ( vect[i] == value ) break;如果编译器把 i 看作 for scope 的一部分,你还要把 i 的声明拿出去。真的需要这样么

2005-10-17 21:21:00 7760 1

原创 Expression Template

如果在 C++ 里面评选称得上是“魔法”的技术,Expression Template (ET,酷吧?) 当之无愧要成为其中一员。如果要求两个数组的内积,该怎么做?    int a[4] = {1,100,0,-1};    int b[4] = {2,2,2,2}; 手写循环就不说了,STL 算法是这样:    inner_product(a, a + 4, b, 0);不错,但是有个问题。S

2005-10-17 06:25:00 5205 3

原创 简单常识——关于string

toupper, tolower地球人都知道 C++ 的 string 没有 toupper ,好在这不是个大问题,因为我们有 STL 算法:string s("heLLo");transform(s.begin(), s.end(), s.begin(), toupper);cout transform(s.begin(), s.end(), s.begin(), tolower);cout 当

2005-10-16 15:24:00 6542 3

转载 Traits

Traits Use of traits is anothercommon programming techniquein conjunction with template programming.  A traits class is ashadowclass that accompani

2005-10-16 03:59:00 2474

原创 Template Metaprogramming - cont.1

MPL 是一个非常聪明的作品,在发挥 C++ 模板威力这方面登峰造极,而其接口的优雅、设计的一致性和思想的完整性让 Loki 这样类似的作品也相形见绌。废话少说,我们上代码。#include #include #include #include #include #include #include #include #include #include #include #include using

2005-10-15 21:29:00 3992

原创 Template Metaprogramming

1. 何谓 Metaprogramming?Metaprogram: program that manipulates another program.Metaprogramming is not a new concept:Compiler is a metaprogram: manipulates your code and produces code in a lower level cod

2005-10-15 18:24:00 4031

原创 模板元编程 --- 用 MPL 解决实际问题

在 STL 中有各种容器,而 STL 算法允许我们对容器中的元素做各种操作,下面的程序对于每一个当代的 C++ 程序员都应该是轻而易举的:#include #include #include #include using namespace std;struct print{    void operator()(const string& _str)    {        cout     }

2005-10-15 15:26:00 5431 4

原创 凤凰涅磐 --- Phoenix 2 发布预览

首先,对于不熟悉 Phoenix 的读者,先介绍一下 Phoenix 是什么。Phoenix 的作者,Joel de Guzman,也就是 Boost.Spirit 的作者,在看到许多往 C++ 中引入 Functional Programming 的努力以后,决定把 Spirit 优雅的设计思想用于建立一个 C++ 的 Functional Programming 库,这就是 Phoenix 了

2005-10-14 14:51:00 3978 3

原创 简单常识——关于stream

从文件中读入一行简单,这样就行了:ifstream ifs("input.txt");char buf[1000];ifs.getline(buf, sizeof buf);string input(buf);当然,这样没有错,但是包含不必要的繁琐和拷贝,况且,如果一行超过1000个字符,就必须用一个循环和更麻烦的缓冲管理。下面这样岂不是更简单?string input;input.reserve

2005-10-12 14:45:00 3477 1

原创 unspecified_bool_type 手法

在 C++ 中,有时候我们需要一个自定义类型能够支持 if(obj) 和 if(!obj) 之类的语法,也就是说MyClass obj;if(obj){  //do something}if(!obj){  //do something}这个需要在智能指针的实现中尤其明显,因为它可以保证与原生 C++ 指针在用法上的一致性。明显的解决方法是重载 operator bool() 转换,但是这样问题太

2005-09-07 16:01:00 2785 5

原创 Java Double-Checked Locking 已死,C++ 呢?

已经有众多文章讨论 double-checked locking 模式在 Java 下面无法正常工作,这里先简要的总结一下。根本原因在于 Java 的 memory model 允许所谓的 out-of-order write ,对于下面的 Java 代码,out-of-order write 可能导致灾难性的结果public static Singleton getInstance(){ if

2005-09-04 15:00:00 7266 11

原创 C++ Multithreading

许多 C++ 权威,或者甚至是计算机科学的权威,都把并行,或者在微观的层面上,多线程,看作下一次革命的主题。很久没有关心这些事情了,今天读了一些相关文章,很有启发。首先是 C++0x  的一篇 proposal N1680: Memory model for multithreaded C++ 。A memory model describes the behavior of threads wi

2005-09-04 00:28:00 1316

原创 What you can do is more important than who your parents are.

在 Kelvin Henney 的 More C++ Threading 里面看到这句话,发觉它可以作为 GP vs. OO 的绝佳注脚。

2005-09-03 15:14:00 927

原创 DiskDefrag: the problem

Problem StatementWhen files are stored on a hard disk, they often become fragmented. This means that the file is not stored in sequential sectors on the disk. The first half of a file might be stored

2005-08-22 10:14:00 996

原创 SimpleRouter: the problem

Problem StatementA routers job is to route packets of information to the correct computer. In addition, a router may throw out some packets, or handle the packets on its own. In this problem, you are

2005-08-22 10:12:00 888

原创 TopCoder challenge: SimpleRouter --- Reloaded

This is the refactored version of SimpleRouter. By using boost.tokenizer, the parsing of rules and packets get simplified. By using polymophic and boost ptr_container, adding new types of rules get mu

2005-08-21 19:16:00 994

原创 TopCoder challenge: SimpleRouter

This implementation is by no means elegant: it does not handle error well; it uses the same space for a forward table with a rule table; it uses hand-coded parsing, which is hard to read and modify...

2005-08-21 00:37:00 1045

原创 regex_test.cpp -- learning boost.regex

boost.regex 库的用法,看来这可能是 boost 当中写法最“常规”的库之一了。regex_test.cpp:#include #include #include #include #include using namespace std;// purpose:// takes the contents of a file in the form of a string// and se

2005-08-20 21:17:00 1074

原创 boost 智能指针 --- 关于性能的少数派报告

开门见山好了,boost 1.33 对于 boost 1.32 的 shared_ptr 和 weak_ptr 有一个不小的改变,然而这个改变如此透明,以至于它甚至于没有出现在 boost  1.33 的 release notes 中。在 1.32 中,shared_ptr 和 weak_ptr 的引用计数使用锁来保证线程安全,下面一段摘自 boost 1.32 的 sp_counted_bas

2005-08-18 23:15:00 4055 5

原创 泛型算法:Tips (4) --- 再论初始化

总有一些时候,我们不能够借助于“生成式”的初始化方法来给容器赋值,例如我们已经有了一个数组,要把它作为初值赋给一个容器,常规的做法已经深入人心了:  int init[] = {2, 3, 5, 7, 11, 13, 17, 19, 23};  std::vector vect(init, init + sizeof(init)/sizeof(int));通过两个 sizeof 来得到数组的大小在

2005-08-16 23:11:00 1009 1

原创 8月11日的 Boost 1.33,bind 库存在的问题

问题的起因很简单,我实验一个简单的程序不过。这个程序的本意是想检验一下 boost.bind 在 1.33 中新加入的比较运算符,我以为这一点也不难,然而程序的运行结果大出我的意料:#include #include #include #include //#include //#include #include //using namespace boost::lambda;using name

2005-08-16 10:07:00 1231 4

原创 泛型算法:Tips (3) --- 初始化

上次提到过为容器生成数据的问题,我给出的用 boost.lambda 的方法是:  std::vector vect(10);  int i = 0;  std::for_each( vect.begin(), vect.end(), _1 = ++var(i) );不错,这样可以生成连续的数字,也还算比较简洁,因为代码量不会随着容器的大小而变化,不过,如果要在容器内填入随机数呢?其实比上面更简单

2005-08-15 23:47:00 1234

原创 泛型算法:Tips (2) --- 累加

如果你想要把一个容器内的所有元素累加起来,应该怎么办?STL 的 accumulate 可以让我们不必自己写循环:#include #include #include #include #include int main(){  std::vector vect;  vect.push_back(1);  vect.push_back(2);  vect.push_back(3);  vect.p

2005-08-14 21:44:00 1501 1

原创 泛型算法:Tips (1) --- bind 基础

从 STL 出现到现在已经这么多年了,泛型算法是它的重要组成,也是其中最“看起来很美”的东西之一。然而在真实的程序设计中,它往往成为程序员的心头一痛,因为一旦要用 for_each ,accumulate 之类的算法做一些稍微复杂一点的事情,你就会发现自己一个头变成两个大。即便是有了 boost::bind 和 boost.lambda 的帮助,事情也仍然是扑朔迷离,求助于 comp.lang.c

2005-08-13 23:56:00 2173 5

原创 关于 Boost.Lambda

Boost.Lambda 的确是一个好东西,用来举例最多的恐怕就是这个了:using namespace boost::lambda;std::vector v;// init valuesstd::for_each(v.begin(), v.end(), std::cout 精致、优雅、易于理解,下面是一个更漂亮的例子:std::map values;// init valuesstd::for

2005-08-11 15:37:00 1422

原创 元编程技法(1)——if_c

一直想整理一下对于meta-programming的一些想法,就从这个最简单的开始吧!if_c是boost::mpl库提供的一个元编程算法,它接受三个模板参数,第一个是bool类型,后面两个是类型名:template      bool c    , typename T1    , typename T2    >struct if_c{    typedef unspecified type;

2005-01-09 15:21:00 1415 2

原创 VC7.1 编译器的一个不大不小的bug

这段代码在任何一个成熟的C++编译器当中都不会通过:class Test{public:    char *p;    static void Tt()    {        p = 0;    }};因为它在static函数中访问实例成员,而在调用static函数的时候,可能根本就没有实例存在,即便存在,它也不会知道该访问哪一个实例的成员。在VC7.1当中,当然也会出现编译错误。但是,如果

2004-12-19 19:28:00 1207 4

原创 仿照boost::lexical_cast,编写一个text_cast

首先说明,这个text_cast不光是编写来玩的,它还有一定的用途。我在最近的一个跨平台(Win32,数个版本的Linux)的项目中用到了boost库,编码的时候还是很爽的,等到了移植的时候,就发现我每到一个平台(数量还在增加)上,就要先把boost编译一下,如果光是这样倒也罢了。更要命的是我发现boost在某些平台上的表现有微妙的差别,例如在异常的处理上,这些给我带来了不少麻烦。在很多次痛苦的追

2004-11-10 21:46:00 1091

原创 一下午的培训

又是一个星期四,培训日。今天下午的培训有点不同:持续四个小时,内容是CMMI。地点也不太相同,平时在比较小的Training Room 2,现在在比较大的Training Room 3。但是一过去,却发现已经坐得满满当当,同事们还在不断往里面搬凳子,看来大家都还是很关心质量体系的。由于每天都有新同事onboard,所以Roc好像会周期性的在培训里面介绍一下自己,他说他是GDCC历史上第二个onbo

2004-10-22 21:45:00 1479 1

原创 boost中的operator及一些探讨

在generic programming中,我们往往希望自己定义的type在行为上和C++内置的类型尽可能的相似,也就是说,可以参与各种各样的表达式运算而不会有阻碍。C++为我们提供强大的运算符重载机制也就是为了这个目的。不幸的是,重载运算符往往是一件枯燥无聊的事情,我们可以大致统计一下,要完全定一个type,我们需要重载的运算符:算术运算:+, -, *, /, %, +=, -=, *=, /

2004-09-30 13:37:00 1119

原创 关于lexical_cast,一点补充

看了凌杰的文章(http://blog.csdn.net/owl2008/archive/2004/09/28/119595.aspx),也想补充两句。lexical_cast比起stringstream来说,的确不一定简洁,当然,其语义和可读性都有提高,但同时也失之灵活。例如下面的情况,似乎就无法用lexical_cast办到。#include using namespace std;int

2004-09-29 22:09:00 1292

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除