2009年2月14日星期六

template & local class

void qnode::on_poschanged() {
struct pos_changed {
inline void operator ()(qio_input * i) {
i->node_poschanged();
}
};
std::for_each(_inputs.begin(), _inputs.end(), pos_changed());
_output->node_poschanged();
}

以目前的c++标准而言,这段代码是通不过的,不过vc2008还是没问题,ms的人务实,
g++编译错误。
当然这是简单的例子,可以用mem_func糊弄过去,然而复杂点的就麻烦了...
所以为了目前的可移植性,尽量还是把class移出去,这是个让人灰心的解决之道。或者,用boost::lambda来替代.
这对于c++号称oo封装的语言来说,为一个封装的便利付出的代价,够讽刺的。

2009年2月13日星期五

跨平台的C++ IDE

http://www.codeblocks.org

支持windows,linux,Mac Os,windows下结合mingw,基本可以脱离vs.
debug也挺方便,只是用的时间还短,不知道稳定性如何。

2009年2月4日星期三

std::string format(const char * format, ...)

很多时候需要这样一个便捷的函数
std::string s = format("string %d ", i);
std::string s = format("string %d %f", i, f);
std::string s = format("string %d %f %s", i, f, s);

ostream用起来很笨拙,而且效率低下,boost::format很强大,不过这么简单的东西就没必要动用boost这个庞然大物了...


std::string format( const char * format, ...)
{
char buf[1024];
va_list arglist;
va_start(arglist, format);
_vsnprintf(buf, 1024, format, arglist);
va_end(arglist);
return std::string(buf);
}

2009年2月3日星期二

auto delete ptr

有时候经常需要这样的一个东西
...
{
T * p = new T ;
....
delete p;
}
...

boost的smart ptr有shared_ptr可以用,不过boost实在太大了,这是唯一让我感到有些不爽的地方。

于是写了一个auto_deleteT的template class

template
class auto_deleteT {
public:
auto_deleteT(T * p) : _ptr(p){
}
~auto_deleteT() {
if(_ptr)
delete _ptr;
}
inline T * operator->() const {// never throws
assert(_ptr != 0);
return _ptr;
}
protected:
T * _ptr;
};

这样可以很方便使用 :
{
auto_deleteT aptr(new T(...));
aptr->xxxx(....)
....
}

接着,再添加一个支持,可以把auto_deleteT放到STL的容器内:
...
auto_deleteT(const auto_deleteT & a){
_ptr = a._ptr;
// giveup pointer.
auto_deleteT & at = (auto_deleteT &)a;
at.reset();
}
auto_deleteT & operator = (const auto_deleteT & a){
_ptr = a._ptr;
auto_deleteT & at = (auto_deleteT &)a;
at.reset();
return *this;
}
void reset() {
_ptr = 0;
}
....
STL容器内部使用的copy复制内容,这样如果auto_delete ptr被复制后,就主动放弃
pointer内容:

{
std::vector objs;
for(int i=0; i < n; i++) {
a(new obj...);
objs.push_back(a);
}
}

不过由于它没有引用计数,所以使用上要小心,不过也不是什么大问题:
objs[n]->xxx()之类的,就可以避免内存泄露。


iocp net lib

去年某个时候,花了几天写了一个基于模板的network lib,基于windows的iocp,源于当时对asio使用繁琐的失望。
由于最近有使用的需要,把代码重新看过一遍,才发现问题多多,于是重新写了一遍,然后看了看asio的文档,才发现这张熟悉的图。

顺便链接下asio作者的blog,http://think-async.blogspot.com/

2009年2月1日星期日

My son





In 01/07/2009, my son, the first baby of mine, came into the world.