如果选择了一条路,就要走到底。
前天做了第一次用C++11替代Boost的实验,用C++11的组件替换掉了很多Boost组件。这两天进行了第二次实验,对一些不能整个库替代的组件,做一些局部取代的尝试。同时,因为VC11提供了filesystem,我也测试了一下这个。
可以直接替换
- Utility的result_of
唯一的区别在于boost::result_of不能作用于成员变量的指针,但KlayGE没用到这个,所以直接替换了。
稍作修改后可以替换
- Filesystem
- MPL的if_
VC11提供了一个基于Filesystem V2的库,而Boost.Filesystem是V3,接口上有略微不同,但不难处理。这里一个额外好处是,原先在Metro下因为一些API的原因,Boost.Filesystem不能编译成功,所有用到的地方都得修改。现在用<filesystem>就保证了Metro和Desktop都能用同样的代码。
虽然C++11没有MPL,但在<type_traits>中提供了一个和MPL的if_相同功能的东西,叫做std::conditional。用mpl::if_实现conditional也是很容易的事情。
用depends查看编译出来的exe可以看到,Boost.System的依赖依然存在,虽然没有直接调用。追踪了一下发现是因为Boost.Pool。在Vista+的系统上,Boost.Pool的作用很有限(虽然比NedMalloc之流好些),却要引入Boost.Thread和Boost.System,得不偿失,所以干脆去掉了所有Boost.Pool的使用。未来某个时候,我会写个或找个更强大的分配器。至此,在VC11上,KlayGE核心、插件、例子和教程所依赖的需要编译的Boost库已经全部去掉,就剩下工具还需要Program Options。
未来
C++11的标准出来之后,委员会应该就转向TR2的工作。Algorithm、Any、Filesystem、Functional/Hash、Lexical Cast和Signals这几个库都有可能进入TR2,并成为系统提供的组件。到时候用起来就更方便了。
Comments