在stl_construct.h中我们说了使用type traits技术来构造与析构对象,以达到最好的效率。现在为了使迭代器通用,我们必需知道迭代器指向的对象的类型,同时这个类型可能是作为变量声明,返回值等来使用。对于用作变量声明,使用模板参数推导可以很好的解决。可以看如下代码:
- template<class Type, class Value>
- void Test(Type ty, Value val) {
- Value c = val; //迭代器的指向的类型就是Value
- //...
- }
- template<class Type>
- void TestInterface(Type b) {
- //...
- Test(b, *b); //*b代表的就是迭代器指向的类型的值
- }
- int main(int argc, char **argv) {
- Iterator a = ...;// a是一个迭代器
- TestInterface(a);
- //...
- return 0;
- }
- template<class RT, class Type, class Value>
- RT Test(Type ty, Value val) {
- Value c = val; //迭代器的指向的类型就是Value
- printf("%d\n", c);
- return c;
- }
- int main() {
- int a = 5;
- Test<int>(&a, a); //调用的时候我们自己指定返回类型,参数类型由模板推导
- return 0;
- }
- template <class T>
- struct MyIter {
- typedef T value_type;
- T* ptr;
- //....
- };
- template<class I>
- typename I::value_type
- func(I itr) {
- return *itr;
- }
返回类型还存在的一个问题就是对于指针类型的处理,因为typedef指针可能会出现问题!
- typedef int * intPtr;
- int main() {
- int a = 5;
- const intPtr ptr= &a;
- printf("%d\n", *ptr);
- *ptr = 6;
- printf("%d\n", *ptr);
- //int b = 7;
- //ptr = &b; //错误
- //printf("%d\n", *ptr);
- return 0;
- }
这个问题的解决办法就是使用模板的偏特化来特殊处理指针类型,下次再说吧。