C++模板相关概念基础与误解

类模板、模板类、函数模板、板函数、特化

Posted by bbkgl on February 5, 2021

独来独往银粟地

一行一步玉沙声

最近通过UE4源码学习对象系统(反射),其中有部分模板和宏的使用发现自己不是很熟悉,这里进行一定的记录,并纠正自己以前的误解。

很多时候都分不清楚类模板/模板类,函数模板/模板函数。。。

还有就是特化和偏特化的使用区别。。。虽然自己菜,一直没用过。

特化

特化,顾名思义就是特殊处理,在模板类/模板函数的生成上进行特殊的处理。

特化分为全特化和偏特化,目前看到的文章都说,“函数模板没有偏特化”,我也暂且没进行验证。

给个小例子进行区分:

template <typename T1, typename T2>
class ClassTemplate {
public:
    ClassTemplate() {
        printf("类模板\n");
    }
private:
    T1 t1;
    T2 t2;
};

template <typename T1, typename T2>
class TemplateClass {};

template <typename T1>
class TemplateClass  <T1, int *> {
public:
    TemplateClass () {
        printf("偏特化\n");
    }
private:
    T1 t1;
    int i;
};
template <>
class TemplateClass <char, int> {
public:
    TemplateClass () {
        printf("全特化\n");
    }
private:
    char t1;
    int i;
};

int main() {
    ClassTemplate<char, int> ct;
    TemplateClass<char, int *> tc1;
    TemplateClass<char, int> tc2;
    return 0;
}

打印结果:

1612518838479

关于模板类/类模板,模板函数/函数模板

目前我的理解是这样的,类似于:

template <typename T>
class vector {
  ....  
};

就是类模板,对应生成的vector<int>vector<char>等就是类或者说模板类,也就是说:类模板是用于生成类或者模板类的模板。

所以函数模板同理,我们平时声明函数上用 template 修饰都属于函数模板,用于生成对应的函数。

那么就可以推导出一个结论,所有特化,或者偏特化的产物,指的都是模板类或者模板函数。