STL源码解析-01stl配置文件


*******************************************************
 * stl 模板的说明及congfig文件解析
 * stl的六大组建:
 * 容器:vector,list
 * 算法:algorithm头文件中
 * 仿函数:和普通函数使用方式一样,在算法中用的较多
 * 迭代器:采用前闭后开区间
 * 配接器:stack
 * 配置器:allocator
 * ****************************************************
 
#include <iostream>
 
using namespace std;
 
*******************************************
 * 01 test __STL_STATIC_TEMPLATE_MEMBER_BUG
 * 测试模板类中是否能够进行静态成员的定义。
 * ****************************************
template <class T>
class testClass1{
    public:
        static int _data;
};
//进行泛化,定义int类型模板类的静态变量。
template<>
int testClass1<int>::_data = 10;
//进行泛化,定义char类型模板类的静态变量。
template<>
int testClass1<char>::_data = 11;
****************************************
 
******************************************
 * 02 test _STL_CLASS_PARTIAL_SPECIALIZATION
 * 是否支持类模板的偏特化
 * 除了一般设计之外,特别针对某些template参数做特殊化处理,
 * 也就是说,当有多个模板类符合时,只调用完全匹配的模板。
 * 例如c++标准库中的类vector的定义
 * template <class T, class Allocator>
 * class vector { // … // };
 * template <class Allocator>
 * class vector<bool, Allocator> { //…//};
 * 这个偏特化的例子中,一个参数被绑定到bool类型,而另一个参数
 * ****************************************
template <class T, class O>
class testClass2{
    public:
        testClass2() {cout << "T,O" << endl;}
};
 
template <class T>
class testClass2<T*, T*>{
    public:
        testClass2(){cout << "T*,T*" << endl;}
};
 
template <class T>
class testClass2<const T, T>{
    public:
        testClass2(){cout << "cont T, T" << endl;} 
};
 
***********************************************
 * 03 __STL_FUNCTION_TMPL_PARTIAL_ORDER
 * 定义是否支持函数模板的偏序实例化,这个功能其实要比模板类的偏特化复杂得多,而且编译器与C++
 * 标准委员会对这个特性的说明还不是很明确,还有不少问题,但这真的是一个十分强大的功能,不可不知。
 * 严格的来说,函数模板并不支持偏特化,但由于可以对函数进行重载,所以可以达到类似于类模板偏特化的效果。
 * template <class T> void f(T);   (a)
 * 根据重载规则,对(a)进行重载
 * template < class T> void f(T*);   (b)
 * 如果将(a)称为基模板,那么(b)称为对基模板(a)的重载
 * ,而非对(a)的偏特化。C++的标准委员会仍在对下一个版本中是
 * 否允许函数模板的偏特化进行讨论。
 * ********************************************
 
**********************************************
 * 04 _STL_MEMBER_TEMPLATES
 * 测试模板函数中是否允许再有模板成员
 * *******************************************
class alloc{
};
 
template <class T, class Alloc = alloc>
class vector{
    public:
        typedef T value_type;
        typedef value_type* iterator;
 
        template <class I>
        void insert(iterator, I, I)
        {
            cout << "insert.\n";
        }
};
***********************************************
 
**********************************************
 * 05 __STL_LIMITED_DEFAULT_TEMPLATES
 * 测试模板参数可否根据前一个模板参数而设定默认值
 **********************************************
template<class T, class Alloc = alloc, size_t BufSiz = 0 >
class deque{
    public:
        deque() {cout << "deque.\n";}
};
template <class T, class Sequence = deque<T> >
class stack{
    public:
        stack(){cout << "stack.\n";}
    private:
        Sequence d;
};
*********************************************
 
**********************************************
 * 06 __STL_NULL_TMPL_ARGS
 * 主要用在类模板中的friend函数声明。
 * config文件实现:
 * #ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS
 *  #define  __STL_NULL_TMPL_ARGS <>
 * #else
 *  #define  __STL_NULL_TMPL_ARGS
 * #endif
 * 具体应用:
 * template <class T>
 * class test{
 *  public:
 *   friend bool operator== __STL_NULL_TMPL_ARGS (const test&, const test&);
 * };
 *
 * template <class T>
 * bool operator==(const test<T>&, const test<T>&)
 * {//
 * }
 **********************************************
 
**********************************************
 * 07 __STL_TEMPLATE_NULL
 * 定义了模板为空的形式,便于在不同的编译器之间移植。
 * 定义:
 * #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
 *  #define __STL_TEMPLATE_NULL template<>
 * #else
 *  #define __STL_TEMPLATE_NULL
 * #endif
 * 具体应用:
 * template <class T> class hash{}
 * __STL_TEMPLATE_NULL class hash<char>{}
 * __STL_TEMPLATE_NULL class hash<int>{}
 * 其实就是泛化的实现
 * **********************************************
 
************************************************
 * 08 __STL_NO_BOOL
 *    如果编译器没有内置bool类型,定义该宏。
 * 09 __STL_HAS_WCHAR_T
 *  编译器是否包含wchar_t内置类型
 * 10 __STL_NO_DRAND48
 *  如果编译器没有drand48这个函数,定义该宏
 * 11 __STL_STATIC_CONST_INIT_BUG
 *  如果编译器在成员声明时不支持integer类型的静态常量初始化,定义该宏
 * 12 __STL_PARTIAL_SPECIALIZATION_SYNTAX
 *  编译器是否支持偏序实例化语法
 * 13 __STL_MEMBER_TEMPLATE_CLASSES
 *  编译器是否支持,内部模板类的定义
 * 14 __STL_TEMPLATE_FRIENDS
 *  是否支持模板friend函数的声明
 * 15 __STL_EXPLICIT_FUNCTION_TMPL_ARGS
 *  在调用函数时,是否提供参数精确匹配的函数
 * 16 __SGI_STL_NO_ARROW_OPERATOR
 *  编译器不能支持->操作符
 * 17 __STL_DEFAULT_CONSTRUCTOR_BUG
 *  如果T是内置类型,T()会报错
 * 18 __STL_USE_EXCEPTIONS
 *  支持异常
 * 19 __STL_USE_NAMESPACES
 *  支持命名空间
 * 20 __STL_NO_EXCEPTION_HEADER
 *  没有<exception>头
 * 21 __STL_NO_BAD_ALLOC
 *  不包含<new>,或包含<new>但是不包含bad_alloc类
 * 22 __STL_SGI_THREADS
 *  在SGI IRIX系统多线程环境下编译时,使用SGI线程而不是pthreads
 * 23 __STL_WIN32THREADS
 *  在WIN32多线程环境下编译
 * 24 __STL_PTHREADS
 *  我们需要用到pthreads线程同步
 * 25 __STL_UITHREADS
 *  我们需要用到UI / solaris / UnixWare线程同步
 * 26 __STL_LONG_LONG
 *  含有long long 和 unsigned long long
 * 27 __STL_THREADS
 *  需要线程的安全性
 * 28 __STL_VOLATILE
 *  如果需要volatile,将该宏定义为volatile,否则定义为空字符串
 * 29 __STL_USE_CONCEPT_CHECKS
 *  允许额外的编译时间错误检查
 * 30 __STL_NO_USING_CLAUSE_IN_CLASS
 *  在类定义中,不支持using语句
 * 31 __STL_NO_FRIEND_TEMPLATE_CLASS
 *  不支持friend模板函数声明
 * 32 __STL_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE
 *  不支持将函数指针作为模板的参数
 * 33 __STL_MEMBER_TEMPLATE_KEYWORD
 *  在某些新位置需要模板关键字
 *  *******************************************************
 
********************************************************
 * 用户可以设置的宏定义
 * 01 __STL_USE_SGI_ALLOCATORS
 *  让STL使用老的allocator
 * 02 __STL_NO_NAMESPACES
 *  不要将库加入std命名空间中
 * 03 __STL_NO_RELOPS_NAMESPACE
 *  不要将关系操作符(>, <=. >=, !=)加入到std::rel_ops命名空间
 * 04 __STL_ASSERTIONS
 *  允许运行时检查
 * 05 _PTHREADS
 *  使用Posix线程
 * 06 _UITHREADS
 *  使用SCO/Solaris/UI线程
 * 07 _NOTHREADS
 *  不支持多线程
 * 08 __STL_USE_NEW_IOSTREAMS
 *  使用新的输入输出流
 * 09 _STL_NO_CONCEPT_CHECKS
 *  不支持错误检查
 *  *****************************************************
 
*****************************************************
 * 在congfig文件中还定义了
 * 与namespace相关的宏
 * 与exception相关的宏
 * 定义了typename等
 * ***************************************************
 
int main()
{
    ************************************
     * 01 测试_STL_STATIC_TEMPLATE_MEMBER_BUG
     * **********************************
    cout << "01 _STL_STATIC_TEMPLATE_MUMBER_BUG undefined." << endl;
    cout << "static testClass1<int>::_data: "<<testClass1<int>::_data << endl;
    cout << "static testClass1<char>::_data: "<<testClass1<char>::_data << endl;
   *************************************
    
    ************************************
     * 02 测试__STL_CLASS_PARTIAL_SPECIALIZATION
     * ***************************************
    cout << "02 __STL_CLASS_PARTIAL_SPECIALIZATION defined." << endl;
    testClass2<int,char> obj1;
    testClass2<int*,int*> obj2;
    testClass2<const int,int> obj3;
    *************************************
    
    ************************************
     * 04 测试__STL_MEMBER_TEMPLATS
     * **********************************
    cout << "04 __STL_MEMBER_TEMPLATES defined." << endl;
    int array[5] = {1,2,3,4,5};
    vector<int> vx;
    vector<int>::iterator it;
    vx.insert(it,array,array+4);
    
    ************************************
     * 05 测试 __STL_LIMITED_DEFAULT_TEMPLATES
     * **********************************
    cout << "05 __STL_LIMITED_DEFAULT_TEMPLATES defined." << endl;
    stack<int> ss;
 
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值