5D空间

学习总结与经验交流

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
摘要:二重模板有什么用,什么情况下使用二重模板,对二重模板进行的某种特化进行重载,=以及拷贝构造函数在二重模板中的注意事项
  
  小记1是因为这个话题很可能还有其他小记。
  在模板下定义一个类,类的方法包括重载的运算符往往可以处理这个类模板对于相同类型参数的特化的对象。但是有时候我们往往希望一个类模板的特化对象的方法还可以处理这个类模板其他特化的对象。一种办法是利用类的性质定义转换构造函数(convert constructor ),但是我们可以使用模板得到一种更通用的方法,那就是在类模板中定义二重模板。
  定义方法很简单,下面的例子会展示。注意内层模板的参数应该与外层模板不一样,而且定义的时候应该使用两层template。
  对于一般的函数和运算符,通常来说,如果只定义一个二重模板的方法,它既可以处理不同类型的特化对象,也可以处理相同类型的特化对象(即T和C是相同类型)。如果在外层模板中另外定义了一个普通的同名方法(以处理相同类型的特化对象),那么在处理相同类型的特化对象时,则会调用这一套方法。这有点像对模板特化进行重载(告诉编译器在特殊情况,这里是特化类型相同,应该使用另外一套方法)。
例如:
如果把8行和14~18行注释掉,那么输出结果均为两行 接受不同类型。
 1#include <iostream>
 2using namespace std;
 3
 4template < typename T >
 5class A
 6{
 7public:
 8    void function( const A< T > & );
 9
10    template < typename C >
11    void function( const A< C > & );
12}
;
13
14template < typename T >
15void A< T >::function( const A< T > & )
16{
17    cout << "接受相同类型" << endl;
18}

19
20template < typename T >
21template < typename C >
22void A< T >::function( const A< C > & )
23{
24    cout << "接受不相同类型" << endl;
25}

26
27int main()
28{
29    A< int > a;
30    A< int > b;
31    A< double > c;
32
33    a.function( b );
34    a.function( c );
35}

  但是对于复制操作符和拷贝构造函数来说,情况有些不一样。因为编译器会为没有定义的类提供默认=以及拷贝构造函数,根据上面的分析,这个默认的东西相当于对二重模板中特殊情况的重载,所以如果只有一个二重模板,那么它将不能处理相同类型的类模板特化的对象。而这时,程序会调用编译器提供的默认=以及拷贝构造函数,而这往往是我们不想要的(我们需要自己定制的=以及拷贝构造函数啊)。所以这时,我们需要自己定制一套非二重模板的=或者拷贝构造函数来满足需求。

例如:
如果把8行和14~18行注释掉,那么输出结果只有一行 为不同类型调用=号 ,因为另外一句话调用了编译器提供的默认=号,所以并没有任何输出。
 1#include <iostream>
 2using namespace std;
 3
 4template < typename T >
 5class B
 6{
 7public:
 8    void operator=const B< T > & );
 9
10    template < typename C >
11    void operator=const B< C > & );
12}
;
13
14template < typename T >
15void B< T >::operator=const B< T > & )
16{
17    cout << "为相同类型调用=号" << endl;
18}

19
20template < typename T >
21template < typename C >
22void B< T >::operator=const B< C > & )
23{
24    cout << "为不同类型调用=号" << endl;
25}

26
27int main()
28{
29    B< int > a;
30    B< int > b;
31    B< double > c;
32
33    a = b;
34    a = c;
35}
posted on 2011-04-05 13:50 今晚打老虎 阅读(1117) 评论(0)  编辑 收藏 引用 所属分类: 学习笔记

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理