在讲述之前,请看c++的类型信息系统:
typeid,sizeof,函数调用,模板特化
这几个DD,或者隐藏地转换C++的类型,或者直接得到类型信息;前两个就不说了,没什么可说的。现在说函数调用,请看如下代码:
void foo(int a){
//
//
}
这样的代码也许天天在写,但是,您有没有注意到,我们在函数调用的时候:
foo(1);
没有提供任何类型信息,编译器却可以准确定位类型。
现在看如下代码:
template<class T>
void foo(T a){
}
在这里,看到没有:
我们的T就直接获取了参数a的类型信息,在这里,您可以对T进行任何的验证!
现在我们可以继续递归地使用别的函数来验证a的别的操作信息!!!
template <class T>
void foo(T a)
{
foo1(a);
foo2(a);
foo3(a);
....
}
什么时候会终止呢,我想应该是:最小的操作子集,然后就可以很明确地知道,它到底在哪个函数里面出错了!!
问题是:
1.真的去执行一遍么?
2.不同函数有不同的类型参数,是否需要为没一个类型信息写一个不同的fooN()函数【N不同!】。
答案:
1.不去真执行,直接取函数地址就可以了。。。
2.把类型参数作为类成员。。写一个函数名称就可以了~
这样写:
取验证0的地址(){
取验证1的地址;
取验证2的地址;
。。。。。
};
既然都是验证,我们就可以把它们封装起来,封装到不同的类里面,由于函数与生俱来的缺陷:
封装不足~~~~命名等一系列问题~~~~~
我们来一次封装。。。这样会更安全,更OO化!!!
template<class T>
class 模板0{
public:
void 验证();
T a;
};
template<class T>
class 模板1
{
public:
void 验证();
T a;
};
现在。。我们取不同命名空间里面,验证的地址就可以了。。
有人说:
用函数来表示一种类型,,,,,,,,,可不可以~~~~~~~~~
我无语~~~~~~~如果一个类型有100个成员,
那么,是不是要写100个函数参数~~~~~~~~!!!!!!!!!!