PoEdu培训 STL班 第一课 模板编程(一)
文章类别: 培训笔记 0 评论

PoEdu培训 STL班 第一课 模板编程(一)

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

STL

模板编程的产生

模板是一种能够产生代码的代码.
它能够节省我们的代码量.

Alt 牲口圈舍设计图

接近实时, 但是代码量大, 难维护, 强聚合.

Alt 牲口圈舍设计图

接口更简单, 代码结构清晰, 但是设计难度大.

Alt 牲口圈舍设计图

代码自动生成, 代码量小, 难维护

模板编程产生是为了解决实际设计中的一些问题.

模板编程

与宏的区别

一些特点

模板只会和它的下一句话相结合

template <typename T>    // 类模板
class Demo                // 模板类
{
public:
    Demo(T in) {};
};

class Demo2{};            // 普通类

模板定义时, 可以有N个类型定义占位符

// 可以有很多个typename
template <typename T, typename T2>    // 类模板
class Demo                            // 模板类
{
public:
    Demo(T2 in) {};

private:
    T TDemo;
    T2 T2Demo;
};

模板定义时可以传递参数, 我们称之为模板参数

// 还能有实际存在的类型
// SIZE就是一个参数, 叫 模板参数, 可以直接使用
template <typename H, int SIZE = 10>        // 类模板
class Demo2                                    // 模板类
{
    Demo2()
    {
        size_ = SIZE;
    }
private:
    int size_;
};

模板参数可以是推导的类型

// 还可以是推导类型
template <typename H, H tmp>            // 类模板
class Demo3                                // 模板类
{
    Demo3()
    {
        hDemo = tmp;
    }
private:
    H hDemo;
};

模板参数必须是一个常量

template <typename H, H tmp>            // 类模板
class Demo                                // 模板类
{
    Demo3()
    {
        hDemo = tmp;
    }
private:
    H hDemo;
};

template <typename T, char tmp>            // 类模板
class Demo2                                // 模板类
{
    Demo3(T t)
    {
        n_ = tmp;
    }
private:
    char n_;
};
int main()
{
    int n = 10;
    //Demo<int, n> d();    // 模板参数必须是常量
    Demo<int, 10> d();
    Demo2<double, 'H'> d2(0.0);
    return 0;
}

模板语句还可以修饰函数, 我们称函数为 模板函数

template<typename T>                // 函数模板
void Swap(T& lhs, T& rhs)            // 模板函数
{
    T tmp = lhs;
    lhs = rhs;
    rhs = tmp;
}

_函数模板_会进行推导, 会推导你参数的类型.

template<typename T>                // 函数模板
void Swap(T& lhs, T& rhs)            // 模板函数
{
    T tmp = lhs;
    lhs = rhs;
    rhs = tmp;
}
int main()
{
    int lhs = 10, rhs = 20;
    Swap(lhs, rhs);
    return 0;
}

模板函数是能够重载的

template<typename T>            // 函数模板
void Swap(T& lhs, T& rhs)            // 模板函数
{
    T tmp = lhs;
    lhs = rhs;
    rhs = tmp;
}

template<typename T1, typename T2>    // 函数模板
void Swap(T1& lhs, T2& rhs)            // 模板函数
{
    T1 tmp = lhs;
    lhs = (T1)rhs;
    rhs = (T2)tmp;
}

void Swap(char& lhs, char& rhs)
{
    char tmp = lhs;
    lhs = rhs;
    rhs = tmp;
}

int main()
{
    {
        int lhs = 10, rhs = 20;
        Swap(lhs, rhs);            // 模板函数生成 Swap<int>
    }

    {
        int lhs = 10;
        double rhs = 20;
        Swap(lhs, rhs);            // 模板函数生成 Swap<int, double>
    }

    {
        char lhs = 'H', rhs = 'x';
        Swap(lhs, rhs);            // 调用Swap(char, char)
    }
    return 0;
}

在模板中的重载是_不能提升转换_的

template <typename T>
T GetMax(T lhs, T rhs)
{
    return lhs > rhs ? lhs : rhs;
}

int main()
{
    GetMax(1, 2);
    GetMax('a', 'b');
    // GetMax('a', 1);        // 错误, 模板函数中的重载是不能提升转换的.
    GetMax<int>('a', 1);        // 强制指定类型

    return 0;
}

未完待续...

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

回复