模板函数与特化函数实现高效dynamicCast

目录

一、概述

二、模板函数

三、模板特化

1、全特化

2、局部特化

四、dynamicCast的模板实现

五、参考


一、概述

        模板是一种参数化的多态工具 所谓参数化的多态性,是指将程序所处理 的对象的类型参数化,使一段程序代码可以用于处理多不同类型的对象。 采用模板编程,可以为各种逻辑功能相同而数据类型不同的程序提供一种代码共享的机制。模板包括函数模板(function template)、类模板(class template)。本文主要讨论函数模板

二、模板函数

        函数模板为所有的函数提供唯一的一段函数代码,增强了函数设计的通用性。使用函数模板的方法是先说明函数模板,然后实例化成相应的模板函数进行调用执行 函数模板不是函数,不能被执行置换代码中的类型参数得到模板函数——实例化,实例化后的模板函数是真正的函数,可以被执行。

        实例化之前,先检查模板代码本身,查看语法是否正确;在这里会发现语法错误,如果遗漏分号等。 实例化期间,检查模板代码,查看是否所有的调用都有效。在这里会发现无效的调用,如该实例化类型不支持某些函数调用或操作符等。普通函数只需要声明,即可顺利编译,而模板的编译需要查看模板的定义(声明和定义需放在同个.h文件)。

三、模板特化

1、全特化

template <class T1,class T2>
void calc(T1 a, T2 a)
{
}

template <>
void calc(double a, double a)
{
}

2、局部特化

(1)、局部特化参数

template <class T1,class T2>
void calc(T1 a, T2 b)
{
}

template <>
void calc(T1 a, double b)
{
}

(2)、局部特化为指针类型

template <class T1,class T2>
void calc(T1 a, T2 b)
{
}

template <class T1,class T2>
void calc(T1* a, T2 *b)
{
}

(3)例子

        假设现在我们有这样一个模板函数max:

template <typename T> const T& max(const T& a, const T& b) {

return a < b ? b : a;

}

        然后现在我们要比较两个字符串的大小,如:

const char* str1 = "ttt"; const char* str2 = "ccc";

        此时如果按一般的实例化,比较的将是str1 和 str2 的大小,即比较指针数值大小,而不是字符串大小,故我们需要实现一个模板函数的特化,如下:

template<> const char* const& max(const char* const& a, const char* const& b) {

return strcmp(a, b) < 0 ? b : a;

}

四、dynamicCast的模板实现

class A
{
public:
	virtual ~A(){}
	virtual int getType()
	{
		return 0;
	}
};

class B:public A
{
public:
	virtual int getType()
	{
		return 1;
	}
};
template <class Target, class Source> 
inline Target* dynamicCast(Source* x) 
{ 
	Target tmp = dynamic_cast<Target>(x); 
	return tmp; 
} 
template<>

inline B* dynamicCast(A* x) 
{ 
	if(x->getType()==1)
	{
		return (B*)(x);
	}
	return NULL; 
}
int _tmain(int argc, _TCHAR* argv[])
{

	A* a=new B();
	B*b=dynamicCast<B>(a);
	delete a;
	return 0;
}

五、参考

我将如何重新实现dynamic_cast? - VoidCC

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kupeThinkPoem

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值