Thursday, October 21, 2010

Singleton模式

1. 优点(相比于全局变量):
 
    1.1 避免污染全局空间。

    1.2 根本上避免了类被重复实例化。因为只能从唯一的接口得到类的instance。

    1.3 允许更灵活的实现策略。

2 缺点:

    2.1 构造函数没法传递参数。

    2.2 销毁instance时,确定销毁顺序很困难。Instance在需要时创建,但没有信息指引不同类型Singleton instance之间的依赖关系。

    2.3 不同厂商的编译器和硬件平台,有可能使用不同的优化措施,这导致Singleton模式在多线程环境下可能有严重的潜在问题,即使使用"Double-checked locking"等措施也不能完全避免。下边这篇文章针对Java,但大部分也适用于C++:
 
         http://www.ibm.com/developerworks/java/library/j-dcl.html

Monday, October 18, 2010

Type Container of Meta-programming

1. boost::tuple

    本身不是为meta-programming而出现的,但是,tuple能包含任意个数据类型,并生成instance,成为融合编译时meta-programming和运行时programming的绝佳工具。

    tuple为元编程提供的工具有:

        element <N, Tuple>::type
        length < Tuple >::value

2. loki::Typelist

     一种类型容器,为元编程提供的方法有:
         Length <TypeList >
         TypeAt <TypeList, N >
         IndexOf <TypeList, T >
         Append <TypeList, T >
         Erase <TypeList, T >
         Replace <TypeList, T, U >

    为编译期到运行期提供映射的工具有:
         GenScatterHierarchy
         GenLinearHierarchy

3. boost::mpl::vector, list, etc.

    专为元编程提供的一套工具,在元编程领域实现了类似于STL container的语义。为元编程提供的方法有:

        begin<>, end<>, transform<>, insert<>...

    为编译期到运行期提供的映射的工具有:
         for_each<>

    总而言之,MPL库在编译期的元编程能力极其强大,但运行期的能力略显不足。

4. boost::fusion

    boost::tuple 和 boost::mpl的结合体,为编译期和运行期的元编程提供支持。并大量使用view来提高编译性能。

   
5. lmp::tuple

    自己使用的light-weight meta-programming toolkit. 与boost::tuple的最主要区别是:当N是一个无效值(比如-1)时,lmp::element< N, lmp::tuple >将返回lmp::null_type,而不是像boost::element< N, boost::tuple >那样由编译器报一个编译错误。

    lmp::tuple的好处是允许高阶的元编程,比如缺省处理类型。