现在的位置: 首页 > 综合 > 正文

C++ template Day Day Up 第6天 class template

2014年01月30日 ⁄ 综合 ⁄ 共 1928字 ⁄ 字号 评论关闭

类模板

 

类模板最常见的应用就是容器,比如我们常用的std::vector

假设下面的代码实现一个Stack

template<typename T>
class Stack
{..
}
;

 

Usage: Stack<int>

上面的代码很容易理解,这个是类模板最基础的用法,在任何C++的书籍当中都可以学习到,让我们加快脚步。

Specializations of Class Templates

上面这个单词的典型翻译我不懂(实例化,特化,很乱……),建议还是记住这个单词吧。

当我们的模板类在处理特定类型的时候需要不同的操作的时候,我们可以利用specialization,例如对于char*的字符串进行比较的时候用<明显是错误的,可以重写一个char*版本的并调用strcmp来判断。

下面举一个不太实际的例子(因为没有必要为string单独specialization):

 

template<> 
class Stack<std::string> 
  … 
}
;

void Stack<std::string>::push (std::string const& elem) 

    elems.push_back(elem);    
// append copy of passed elem 
}

 

 

这里重点演示specialization的语法。

 

Partial Specialization

这个特性在Generic Programming中非常常用,还是看例子:

 

如果用

MyClass<int,int> m;

会有二义性错误,因为compiler不知道是<T,T>还是<T,int>

当然

MyClass<int*,int*>也是有二义性的。

 

需要注意的是,在partial specialization的时候,需要参数列表中的参数个数与原始的模板类所指定的参数个数相同。

 

Partial specialization有什么用呢,下面的代码给人以无限的遐想:

template <class Window, class Controller>
class Widget
{
   ... generic implementation ...
}
;
template 
<>
class Widget<ModalDialog, MyController>
{
   ... specialized implementation ...
}
;
// Partial specialization of Widget
template <class Window>
class Widget<Window, MyController>
{
   ... partially specialized implementation ...
}
;


Default Template Arguments

template <typename T, typename CONT = std::vector<T> > 
class Stack 
  
private
    CONT elems;               
// elements 

}

template <typename T1, typename T2> 
class MyClass 
  … 
}

// partial specialization: both template parameters have same type 
template <typename T> 
class MyClass<T,T> 
  … 
}


// partial specialization: second type is int 
template <typename T> 
class MyClass<T,int> 
  … 
}


// partial specialization: both template parameters are pointer types 
template <typename T1, typename T2> 
class MyClass<T1*,T2*> 
  … 
}
;


MyClass
<int,float> mif;    // uses MyClass<T1,T2> 
MyClass<float,float> mff;  // uses MyClass<T,T> 
MyClass<float,int> mfi;    // uses MyClass<T,int> 
MyClass<int*,float*> mp;   // uses MyClass<T1*,T2*>

抱歉!评论已关闭.