• 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系统,在编译时阶段,获取到类型相关信息就很吸引人.

  • 相关阅读:
    实验三:UML 建模工具的安装与使用
    结对编程 第二阶段
    实验二:结对编程 第一阶段
    结对编程之github使用自己的仓库
    软工 实验一 Git代码版本管理
    第七次作业
    第5次作业
    第四次作业
    第三次作业
    第二次作业
  • 原文地址:https://www.cnblogs.com/flytrace/p/2877457.html
Copyright © 2020-2023  润新知