模版特化

模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的。

模板分为类模板与函数模板,特化分为全特化与偏特化。全特化就是限定死模板实现的具体类型,偏特化就是如果这个模板有多个类型,那么只限定其中的一部分。

 1 template<typename T1, typename T2>
 2 class Test
 3 {
 4 public:
 5     Test(T1 i,T2 j):a(i),b(j){cout<<"模板类"<<endl;}
 6 private:
 7     T1 a;
 8     T2 b;
 9 };
10
11 template<>
12 class Test<int , char>
13 {
14 public:
15     Test(int i, char j):a(i),b(j){cout<<"全特化"<<endl;}
16 private:
17     int a;
18     char b;
19 };
20
21 template <typename T2>
22 class Test<char, T2>
23 {
24 public:
25     Test(char i, T2 j):a(i),b(j){cout<<"偏特化"<<endl;}
26 private:
27     char a;
28     T2 b;
29 };

那么下面3句依次调用类模板、全特化与偏特化:

Test<double , double> t1(0.1,0.2);
Test<int , char> t2(1,‘A‘);
Test<char, bool> t3(‘A‘,true);  

对于函数模板,却只有全特化,不能偏特化:

//模板函数
template<typename T1, typename T2>
void fun(T1 a , T2 b)
{
    cout<<"模板函数"<<endl;
}  

//全特化
template<>
void fun<int ,char >(int a, char b)
{
    cout<<"全特化"<<endl;
}  

//函数不存在偏特化:下面的代码是错误的
/*
template<typename T2>
void fun<char,T2>(char a, T2 b)
{
    cout<<"偏特化"<<endl;
}
*/  

至于为什么函数不能偏特化,似乎不是因为语言实现不了,而是因为偏特化的功能可以通过函数的重载完成。

时间: 2024-10-06 10:51:14

模版特化的相关文章

模版的完全特化与偏特化

模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的. 模板分为类模板与函数模板,特化分为全特化与偏特化.全特化就是限定死模板实现的具体类型,偏特化就是如果这个模板有多个类型,那么只限定其中的一部分. 模版特化:任何针对模版参数进一步进行条件限制设计的特化版本. <<泛型思维>> 完全特化:针对所有的模版参数进行特化. <<c++ primer>> 类模板: template<class T,class N&g

为什么不要特化函数模版?

/* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm;

C++模版编程实现Haskell的函数模式匹配特性[图]

C++模版编程实现Haskell的函数模式匹配特性[图]:大神 Bartosz Milewski 在2009年写了一篇文章<What Does Haskell Have to Do with C++?>,使用C++实现Haskell函数式编程语言的一些特性.[传送门在文末]其中有这样一段例子:// code 11.template<int n>class fact {2.public: staticconstint value = n * fact<n -1>::val

C/C++知识点总结(5)

运算符重载函数的限制: 五个不能实现重载的符号:".", ".*", "::", "?", "sizeof": 重载运算符可以定义为类成员函数(这时候可以向当前对象发送消息的动作执行操作),也可定义为全局函数(一般为对应类的友元函数,此类函数需要显式指定所有参数,并且如果有转换构造函数,则可以使用于所有参数类型的运算); 一般的重载运算符函数可以被派生类继承使用,但是赋值运算符重载函数不能被继承:因此每一个

c++ 中的函数查找

template <class T> class visibility { public: void say(double d){}; private: void say(int i){}; void say(T t){}; }; int _tmain(int argc, _TCHAR* argv[]) { visibility<char*> v; v.say(123); // error C2248: 'visibility<T>::say' : cannot acc

STL源码分析--萃取编程(traits)技术的实现

1.为什么要出现? 按照默认认定,一个模板给出了一个单一的定义,可以用于用户可以想到的任何模板参数!但是对于写模板的人而言,这种方式并不灵活,特别是遇到模板参数为指针时,若想实现与类型的参量不一样的实例化,就变得不太可能了!也有时,想禁止此种相同的实例化变得不太可能!故而出现了,Partial Specialization! 同时,在使用void*指针时,可以最大限度的共享代码,减少代码的膨胀! 2.它是什么?其实,就是用户定义的偏特化.用template<>来说明这是一个偏特化,针对任何模板

STL源代码分析--萃取编程(traits)技术的实现

1.为什么要出现? 依照默认认定.一个模板给出了一个单一的定义,能够用于用户能够想到的不论什么模板參数!可是对于写模板的人而言,这样的方式并不灵活.特别是遇到模板參数为指针时,若想实现与类型的參量不一样的实例化.就变得不太可能了!也有时.想禁止此种同样的实例化变得不太可能! 故而出现了,Partial Specialization! 同一时候,在使用void*指针时.能够最大限度的共享代码,降低代码的膨胀! 2.它是什么?事实上,就是用户定义的偏特化.用template<>来说明这是一个偏特化

C/C++面试题目总结

目录 1. 多态性都有哪些?动态绑定怎么实现? 3 2. 虚函数,虚函数表里面内存如何分配? 3 3. 纯虚函数如何定义,为什么析构函数要定义成虚函数? 4 4. C++中哪些不能是虚函数? 4 5. 类型转换有哪些? (参考) 4 6. 为什么要用static_cast转换而不用c语言中的转换? 4 7. 操作符重载(+操作符),具体如何去定义? 5 8. 内存对齐的原则? 5 9. 内联函数与宏定义的区别? 5 10. 关键字static.extern.const.typedef 5 11.

网易内推(C++/C研发)offer之路 精

作者:张佃鹏链接:https://www.nowcoder.com/discuss/3038来源:牛客网 网易内推(C++/C研发)offer之路 精 张佃鹏 编辑于 2016-03-01 09:22:41 回复59 | 已赞 129 | 浏览49340 网易内推(C++/C研发)offer之路 精 看到大家都在牛客上写面经,我也来凑一下热闹,本人是一所普通高校的研究生(非211,985高校),自动化专业(非计算机). 上个星期拿到了网易内推C++研发岗位的offer,在这里要感谢师姐给予的内推