关于Template

来源:互联网 发布:windows键没反应 win10 编辑:程序博客网 时间:2024/06/03 19:30

关于Template小知识

Template并非一次编译便生成所有所有型别的代码<也不可能做到,任意一种自定义类型的结构>,而是针对被使用的某个(或某组<偏特化>)型别进行编译。摘自C++标准程序库,<里面内容为个人所加>。

即表明Template是运行时编译的,这个时候Template Function 也必须定义在头文件中(编译器需要找到明确的函数定义并实例化),不能像其他明确的 Function、Class 可以分别在头文件和.CPP文件中存放。

关键字 typename 除了可以在声明型别中起使用,还有另外一种用法。考虑下面例子:

template<class T>class MyClass{    typename T::SubType * ptr;    ...};

在这里T必须得是一个复合类型,且里面有类型SubType,例如:

class T{    typedef int SubType;};

此外还有成员模板

example 1class MyClass{    template<class T>    void f(T);};example 2template<class T>class MyClass{    template<class U>    MyClass (const MyClass<U> &x);};

需要注意的是在这里Template Constructor 并不会覆盖 implicit constructor(默认构造函数,毕竟只是个 template).这里补充一下 Template Constructor的作用是可以用不同类型的对象来初始化本对象。

例如Myclass<int> my(Myclass<float>());
这是合法的,如果 Copy Constructor 非 template 则这是非法的。

当然 Template Class 也可以像函数一样“带默认形参值”.
注:仅有Tempalte Class才可以,Template Function 是不可行的。

例如:

#include<iostream>#include <typeinfo.h>using namespace std;template<class T,class B = int>class test{public:    static void fun()    {        T a; B b;        cout<<typeid(a).name()<<endl;        cout<<typeid(b).name()<<endl;    }};int main(){    test<float>::fun();    return 0;   }

运行结果下图所示:


0 0
原创粉丝点击