现在假如说我们有一个通用的函数create用于来创建对象,但是对于某些特殊的类来说,创建方式又有所不同(参数不同),这里我们假设所有的类都继承自Animal类,Person类也同样如此,但是Person类的初始化方式比Anima类多了一个参数(这个参数是个常数)这个时候,解决方式有两种:
首先来看第一种:
template
T *create(U args,T ){};
template
T *create(U args,Person ){};
这里对create进行重载,唯一的区分是第二个函数的第二个参数类型必须是Person类型,但是你注意到没,当你调用第二个的时候,虽然起到了区分的作用,但是你需要传递进来一个构造的具体对象,虽然这个对象你并不需要,这会造成性能问题,所以鉴于此,便有了下面的改进版本。
template
struct Type2Type{
typedef T TypedT;
};
template
T *create(U args,Type2Type
){}; template
T *create(U args,Type2Type
){};
这里定义了一个新的结构体Type2Type,这个结构体中不存在元素,所以没有开销,但是能够区分不同的方法调用,这已经足够了,不是么。