`
daojin
  • 浏览: 676741 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

用模板来进行类型检查。

阅读更多

 在讲述之前,请看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个函数参数~~~~~~~~!!!!!!!!!!

 

 

 

 

    

 

 

 

 

 

 

 

 

 

 

 

 

 

       

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics