*******************************************************
* 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;
}