STL源码解析之SGI的宏定义开关
源码解析
__STL_NO_BOOL
判定是否有bool的方式:
- 判断是否有 _BOOL 宏
- 判断特定编译器
__STL_NO_DRAND48
是否有 drand48 求随机数函数.
__STL_STATIC_TEMPLATE_MEMBER_BUG
模板类中定义静态成员
必须特化之后初始化
不是所有编译器都支持.
template<typename T>
class Demo
{
public:
static int data_;
};
// 在初始化的时候 必须在 特化之后初始化
int Demo<int>::data_ = 0;
__STL_STATIC_CONST_INIT_BUG
静态常量是否能够正常初始化
C++标准, 9.4.2章节第4段规定,
只能 static const int x可以在类中直接初始化.
class Demo
{
public:
int a_; // int a_ = 0; 不允许
static int b_; // static int b_ = 10; 不允许 必须外部初始化
static const int c_; // static const int c_ = 10; 允许
static const double d_; // static const double d_ = 10.0 不允许 必须外部初始化
};
int Demo::b_ = 10;
static const double d_ = 10.0;避免在类中成员变量的定义时进行初始化
__STL_CLASS_PARTIAL_SPECIALIZATION
是否支持模板类局部特化
__STL_PARTIAL_SPECIALIZATION_SYNTAX
类模板的部分排序
实例同下面 函数模板的部分排序
__STL_FUNCTION_TMPL_PARTIAL_ORDER
函数模板的部分排序
template<typename T>
void Foo(T t)
{
}
// 和上边构成重载
template<typename T>
void Foo(T* pt)
{
}
// 和上边构成重载
template<typename T>
void Foo(const T* cpt)
{
}
// 特化 它是属于哪个函数的特化???
// 按照偏序实例化规则, 它属于 第二个T* 的特化.
template<>
void Foo(int* n)
{
}
__STL_MEMBER_TEMPLATES
是否支持 模板成员
template <typename T>
class Demo
{
template <typename T1>
void Foo(T t, T1 t1)
{
}
}__STL_MEMBER_TEMPLATE_CLASSES
是否支持一个模板类是内部类
class Demo
{
template <typename T>
class neste
{
T data_;
public:
neste(T t) : data_(t) {}
}
neste<int> data_;
public:
Demo(int data) : data_(data) {}
};
template <typename X>
class DemoTemplate
{
template <typename T>
class neste
{
T data_;
public:
neste(T t) : data_(t) {}
}
neste<X> data_;
public:
Demo(X data) : data_(data) {}
};__STL_TEMPLATE_FRIENDS
一个模板类是否可以为其他类的友元
是否支持模板化的友元声明
比如 ostream::operator<<
__STL_EXPLICIT_FUNCTION_TMPL_ARGS
是否支持函数对模板参数的推导
是否编译器在进行方法调用的时候, 就已经知道了模板参数的类型.
__STL_LIMITED_DEFAULT_TEMPLATES
是否无法处理依赖于前一个模板参数的默认模板参数
template <typename T, typename CON = vector<T> >
class Stack
{
}
__STL_NON_TYPE_TMPL_PARAM_BUG
是否可以接受一个non-type的参数
template<int size>
class Demo
{
int data_[size];
};
__SGI_STL_NO_ARROW_OPERATOR
是否支持迭代器的 -> 运算符
__STL_DEFAULT_CONSTRUCTOR_BUG
默认(内置)类型是否支持 T() 这样的 默认构造
printf("%d", int(10));
int n(20);
printf("%d", n);__STL_USE_EXCEPTIONS
是否支持异常
__STL_USE_NAMESPACES
是否支持命名空间
__STL_NO_EXCEPTION_HEADER
没有异常头文件
__STL_NO_BAD_ALLOC
__STL_SGI_THREADS
SGI IRIX 下, 使用自己的线程库
__STL_WIN32THREADS
WIN32系统, 使用WIN32的线程库
__STL_PTHREADS
LINUX系统, 使用POSIX
__STL_UITHREADS
__STL_LONG_LONG
__STL_THREADS
是否线程安全的
__STL_VOLATILE
__STL_USE_CONCEPT_CHECKS
__STL_NO_USING_CLAUSE_IN_CLASS
类定义中不能用using
__STL_NO_FRIEND_TEMPLATE_CLASS
友元是模板类的时候, 不支持成为其他类的友元
__STL_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE
不支持使用函数指针类型作为模板的参数
template<typename T>
// T不能是函数指针. 如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2017-04-05 at 04:28 pm