zoukankan      html  css  js  c++  java
  • boost一个编译时计数类的实现(__if_exists关键字)

    使用在BOOST_TYPEOF宏中.

    # if BOOST_WORKAROUND(BOOST_MSVC,>=1300) && defined(_MSC_EXTENSIONS)
            template<int N> struct the_counter;
    
            template<typename T,int N = 5/*for similarity*/>
            struct encode_counter
            {
                __if_exists(the_counter<N + 256>)
                {
                    BOOST_STATIC_CONSTANT(unsigned,count=(encode_counter<T,N + 257>::count));
                }
                __if_not_exists(the_counter<N + 256>)
                {
                    __if_exists(the_counter<N + 64>)
                    {
                        BOOST_STATIC_CONSTANT(unsigned,count=(encode_counter<T,N + 65>::count));
                    }
                    __if_not_exists(the_counter<N + 64>)
                    {
                        __if_exists(the_counter<N + 16>)
                        {
                            BOOST_STATIC_CONSTANT(unsigned,count=(encode_counter<T,N + 17>::count));
                        }
                        __if_not_exists(the_counter<N + 16>)
                        {
                            __if_exists(the_counter<N + 4>)
                            {
                                BOOST_STATIC_CONSTANT(unsigned,count=(encode_counter<T,N + 5>::count));
                            }
                            __if_not_exists(the_counter<N + 4>)
                            {
                                __if_exists(the_counter<N>)
                                {
                                    BOOST_STATIC_CONSTANT(unsigned,count=(encode_counter<T,N + 1>::count));
                                }
                                __if_not_exists(the_counter<N>)
                                {
                                    BOOST_STATIC_CONSTANT(unsigned,count=N);
                                    typedef the_counter<N> type;
                                }
                            }
                        }
                    }
                }
            };
    
    # define BOOST_TYPEOF_INDEX(T) (encode_counter<T>::count)
    # define BOOST_TYPEOF_NEXT_INDEX(next)
    # else
            template<int N> struct encode_counter : encode_counter<N - 1> {};
            template<> struct encode_counter<0> {};
    
            //Need to default to a larger value than 4, as due to MSVC's ETI errors. (sizeof(int)==4)
            char (*encode_index(...))[5];
    
    # define BOOST_TYPEOF_INDEX(T) (sizeof(*boost::type_of::encode_index((boost::type_of::encode_counter<1005>*)0)))
    # define BOOST_TYPEOF_NEXT_INDEX(next) friend char (*encode_index(encode_counter<next>*))[next];
    # endif

     笔记:

      保存全局的类型列表(type list).在mirror库里使用另一种方法(使用__counter__关键字,具体实现有待深入),能够在一个类定义时,将该类保存到一个能够索引的地方.即使是模板编程,也需要在定义时确定类型或者得到类型信息.比如定义一个tuple, 在定义时你需要类似:typedef boost::mpl::vector<int, float, double> tuple;既是tuple在被定义时,int,float,double3个类型是准备好了(即使是前向声明).而如果你想在以后扩充,比如加入一个char类型, typedef boost::mpl::vector<int, float, double,char> tuple;是不可能的,这样会重复定义,duple无论如何是不能扩充一个新类型的.可是如果存在一个方法手段,每当我们在新的代码位置定义一个新类型时,都能把这个类型保存到一个"统一"的地方供我们索引,无疑是很有用的.比如设计一个rtti系统,在编译时阶段,获取到类型相关信息就很吸引人.

  • 相关阅读:
    发布wordpress for .net monosys,及monosys带来的更好的虚机+paas选型
    服务器的“服务器”,enginx之于分布式部署的创新意义:使任何服务器程序秒变集群
    共享在阿里云ecs上安装自定义iso的方法
    基于虚拟机的devops套件及把dbcolinux导出为虚拟机和docker格式
    基于openerp的erpcmsone:可当网站程序可当内部知识管理及ERP,及前后端合一的通用网站程序选型,设计与部署
    兼容多OS or 融合多OS?打造实用的基于osxsystembase的融合OS管理器
    freemarker教程
    EL表达式
    jstl的mavin依赖
    Maven依赖范围及依赖传递
  • 原文地址:https://www.cnblogs.com/flytrace/p/2877457.html
Copyright © 2011-2022 走看看