类模板补充定义时,在原模板中不能使用2个虚拟类型参数吗??

SheFuZuo 2009-06-10 10:35:49
#include <iostream>
using namespace std;

//模板类定义
template<typename T1, typename T2>
class FUN
{
T1 data1;
T2 data2;
public:
FUN(T1, T2);
T1 getData1()const;
T2 getData2()const;
};

template<typename T1, typename T2>
FUN<T1, T2>::FUN(T1 d1, T2 d2):data1(d1),data2(d2){}
template<typename T1, typename T2>
T1 FUN<T1, T2>::getData1()const{ return data1; }
template<typename T1, typename T2>
T2 FUN<T1, T2>::getData2()const{ return data2; }

//补充模板定义,为什么上面改为1个虚拟类型参数才可以编过去??
template<>
class FUN<char *>
{

char *data1;
T2 data2;
public:
FUN(char *, T2);
char *getData1()const;
T2 getData2()const;
};


template<>
FUN<char *>::FUN(char * d1, T2 d2):data2(d2)
{
if(d1 == NULL) data1 = NULL;
data1 = new char[strlen(d1) + 1];
strcpy(data1, d1);
}
template<>
char * FUN<char *>::getData1()const{ return data1; }
template<char *>
T2 FUN<char *>::getData2()const{ return data2; }

int main()
{
FUN <int, double>obj(1, 0.1);
system("pause");
return 0;
}
...全文
150 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
SheFuZuo 2009-06-11
  • 打赏
  • 举报
回复
非常感谢!!
goodname 2009-06-10
  • 打赏
  • 举报
回复
http://blog.csdn.net/zxx26/archive/2006/05/12/726009.aspx
模板的特化与偏特化
最近在学习媒体服务器的源码时, 由于要将其底层改写为模板实现, 才看到模板的偏特化, 惭愧ing...
基本总结如下:

为了需要,针对特定的类型,需要对模板进行特化,也就是特殊处理, 是为模板的特化.
template <class T>
class A {};
template < >
class A<bool> { //…// };
上述定义中template < >告诉编译器这是一个特化的模板。

模板的特化在VC6下不行(不支持), VC7可以.
如以下求指数的代码(将运算在编译期完成, 执行期的速度大大加快, 适用于编译一次, 运行N次, 且对运行期的速度要求很高的场合):
template<int Base, int Exponent>
class XY
{
public:
enum { result_ = Base * XY<Base, Exponent - 1>::result_ };
};

template<int Base>
class XY<Base, 0>
{
public:
enum { result_ = 1 };
};

模板的偏特化是指需要根据模板的某些但不是全部的参数进行特化.
严格的来说,函数模板并不支持偏特化,但由于可以对函数进行重载,所以可以达到类似于类模板偏特化的效果。

模板函数可以允许在根据一个特定的数据类型定制其函数产生代码,这也就是所谓的偏特化(partial specialization),当编译器找到与函数调用匹配的偏特化定义的时候,编译器会优先使用该定义,而不再寻找模板定义。
模板函数可以有进行如下的偏特化定义:
template<> functionname<int>(int &t1 , int &t2){...} 或者
template functionname<int>(int &t1 , int &t2){...} 或者
template functionname(int &t1 , int &t2){...}
这三种定义是等同的.
这些声明的意思是:不要使用functionname函数模板来生成一个函数定义,而应该使用独立的、专门的函数定义显示的为数据类型int生成函数定义.

至于函数的选择原则, 可以看看C++ Primer中的说明.
I、 创建候选函数列表,其中包含与被调用函数名字相同的函数和模板函数。
II、使用候选函数列表创建可行的函数列表。这些都是参数数目正确的函数,并且有一个隐式的转换序列(参数类型转化),其中包括实参类型与相应的形参类型完全匹配情况。
III、确定是否有最佳的可行函数,有则调用它,没有则报错。
可行函数的最佳性,主要是判断使用函数的参数与可行性函数的参数的转换规则进行判断,从最佳到最差的顺序如下所示:
i、完全匹配,但常规函数优先于显示定义模板函数,而显示定义模板函数优先于模板函数。
ii、提升转换,即从小精度数据转换为高精度数据类型,如char/short 转换为int , int转化为long,float转换为double。
iii、标准转换,如int转化为char,long转化为double等
iiii、用户自定义转换。
goodname 2009-06-10
  • 打赏
  • 举报
回复
http://blog.csdn.net/zade/archive/2005/12/06/544731.aspx

模板特化,全特化,偏特化,全部特化,部分特化的含义收藏

这几个名词真是把人搞混了(是因为有的著作,甚至名著以讹传讹),我最近整理了以下,看看大家的意见如何。

模板特化:任何针对模板参数进一步进行条件限制设计的特化版本。《泛型思维》

全特化就是全部特化,即针对所有的模板参数进行特化。《c++ primer》
偏特化就是部分特化,即针对部分模板参数进行特化。《c++ primer》

全特化和偏特化的定义不是很严格,所以有的时候不容易让人理解。

举例如下:
template<class U,class T>
class C{};
全特化:
template<>
class C<int,char>{};
偏特化:
template<class U>
class C<U,int>{};
大家应该对上面的例子应该没有什么异议吧。

再看下面的一个例子:
template<class T,class U>
class C<T*,U*>{};
这属于全特化还是偏特化呢?一般大部分人都认为是偏特化,但是按照上面的定义似乎应该是全特化(所有的模板参数都特化了呀)。

我觉得没有必要在名词上作口舌之争,全特化也好,偏特化也好,只要我们掌握它的意义即可。折中的来看,我认为就可以称之为模板特化,毕竟它符合模板特化的含义。

顺便说一下:《c++ primer》这本书没有很好的说明全特化和偏特化的含义,造成很多的歧义,我对这个问题也是迷茫了好久。

规范的原文是这样的:

The standard term explicit specialization refers to a language feature that we call full specialization instead. It provides an implementation for a template with template parameters that are fully substituted: No template parameters remain. Class templates and function templates can be fully specialized. So can members of class templates that may be defined outside the body of a class definition (i.e., member functions, nested classes, and static data members).
pengzhixi 2009-06-10
  • 打赏
  • 举报
回复
你这不是虚拟参数,而是模板特化.

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧