PoEdu培训 STL班 第六课 STL源码解析之SGI配置解析
文章类别: 培训笔记 0 评论

PoEdu培训 STL班 第六课 STL源码解析之SGI配置解析

文章类别: 培训笔记 0 评论

STL源码解析之SGI的宏定义开关

源码解析

__STL_NO_BOOL

判定是否有bool的方式:

  1. 判断是否有 _BOOL 宏
  2. 判断特定编译器

__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不能是函数指针.   

如有错误,请提出指正!谢谢.

回复