ATL布幔之下的秘密(3)
2006-07-22 22:54:58 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁惧墽鎳撻—鍐偓锝庝簻椤掋垺銇勯幇顖毿撻柟渚垮妼椤粓宕卞Δ鈧獮濠勭磽閸屾艾鈧懓顫濋妸鈺佺疅缂佸顑欓崥瀣煕椤愵偅绶氱紓鍐╂礋濮婂宕掑▎鎴М濠电姭鍋撻梺顒€绉甸幆鐐哄箹濞n剙濡肩紒鎰殜閺屸€愁吋鎼粹€茬敖婵炴垶鎸哥粔鐢稿Φ閸曨垰鍐€妞ゆ劦婢€濞岊亪姊虹紒妯诲蔼闁稿海鏁诲濠氭晲婢跺﹤宓嗛梺缁樺姈缁佹挳宕戦幘璇叉嵍妞ゆ挻绋戞禍鐐叏濡厧浜鹃悗姘炬嫹

核心提示:介绍如果你是个模板的高手,你就可以将ATL的学习作为一种享受,ATL布幔之下的秘密(3),在这一节中,我将要尝试解释一些ATL使用的模板技术,程序37.#include <iostream>using namespace std;template <typename T>class Stack
介绍
如果你是个模板的高手,你就可以将ATL的学习作为一种享受。在这一节中,我将要尝试解释一些ATL使用的模板技术。我不能保证你读完本节后能成为一个模板高手,只能是尽我所能让你在读完本文后能够更轻松地理解ATL的源码。
程序35.
#include <iostream>
using namespace std;
template <typename T>
T Maximum(const T& a, const T& b) {
return a > b ? a : b;
}
int main() {
cout << Maximum(5, 10) << endl;
cout << Maximum(''A'', ''B'') << endl;
return 0;
}
程序的输出为:
10
B
在这里,由于模板函数的关系,我们就没有必要分别重载int和char数据类型的函数版本了。其中很重要的一点是,函数的两个参数类型必须一致。但是如果我们传入了不同的数据类型,我们就需要告知编译器应该把这个参数考虑为哪种数据类型。
程序36.
#include <iostream>
using namespace std;
template <typename T>
T Maximum(const T& a, const T& b) {
return a > b ? a : b;
}
int main() {
cout << Maximum<int>(5, ''B'') << endl;
cout << Maximum<char>(5, ''B'') << endl;
return 0;
}
程序的输出为:
66
B
我们也可以编写类模板,下面就是一个简单版本的堆栈类模板。
程序37.
#include <iostream>
using namespace std;
template <typename T>
class Stack {
private:
T* m_pData;
int m_iTop;
public:
Stack(int p_iSize = 0) : m_iTop(0) {
m_pData = new T[p_iSize];
}
void Push(T p_iData) {
m_pData[m_iTop++] = p_iData;
}
T Pop() {
return m_pData[--m_iTop];
}
T Top() {
return m_pData[m_iTop];
}
~Stack() {
if (m_pData) {
delete [] m_pData;
}
}
private:
Stack(const Stack<T>&);
Stack<T>& operator = (const Stack<T>&);
};
int main() {
Stack<int> a(10);
a.Push(10);
a.Push(20);
a.Push(30);
cout << a.Pop() << endl;
cout << a.Pop() << endl;
cout << a.Pop() << endl;
return 0;
}
这个程序中没有任何错误检验,不过这个程序的目的只是示范模板的用法,而不是真的要写一个专业的堆栈类。
[]
更多精彩
赞助商链接