独来独往银粟地
一行一步玉沙声
最近通过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;
}
打印结果:
关于模板类/类模板,模板函数/函数模板
目前我的理解是这样的,类似于:
template <typename T>
class vector {
....
};
就是类模板,对应生成的vector<int>
,vector<char>
等就是类或者说模板类,也就是说:类模板是用于生成类或者模板类的模板。
所以函数模板同理,我们平时声明函数上用 template
修饰都属于函数模板,用于生成对应的函数。
那么就可以推导出一个结论,所有特化,或者偏特化的产物,指的都是模板类或者模板函数。