前言5 S: y$ M7 Z0 n7 b, i
常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。+ f+ r0 q& ?7 B) w" M3 ^* o- v( W
本文对象是那些熟悉模板但还没有很多编写模板经验的程序员。本文只涉及模板类,未涉及模板函数。但论述的原则对于二者是一样的。
! a* l; x1 Y; _. X 问题的产生
% D7 Z, {3 s' Y. D 通过下例来说明问题。例如在array.h文件中有模板类array:
& {1 ^) U# i- Y/ z4 l; } // array.h; }- h: J- [$ z9 @5 y
template 6 H* W, B& e( q2 i' b! o
class array4 j$ ~3 E0 @1 _2 S' t* J
{0 Z# F+ Z* k5 K4 `1 i+ Z) y' `
T data_[SIZE]; \, e) _" t8 n6 \
array (const array& other);% X1 _- r$ R, f: w" r3 S
const array& operator = (const array& other);
6 o8 d0 L. L5 K1 X+ Z% \7 D& U4 K1 z7 M' l public:
0 q' S& t( U! D; i4 Y array(){};
; ^' O$ m# o, C2 p. W; x+ X T& operator[](int i) {return data_;}
- H$ L5 ^2 B" D" _ const T& get_elem (int i) const {return data_;}# B4 O1 @6 T7 P, I" D
void set_elem(int i, const T& value) {data_ = value;}7 r5 c. o" y5 t4 K
operator T*() {return data_;}
6 a+ m* r1 @0 `! d0 } };
- E/ J k! \4 q 然后在main.cpp文件中的主函数中使用上述模板:! S7 c& j% H6 n; e* ~
// main.cpp9 y+ l8 C g. n2 m# F! g/ u' z
#include "array.h"
; i" {: r$ R* @. G int main(void)5 |9 p6 W: G7 `" @5 K
{
+ h- h' X! o% a( v array intArray;
9 I2 Z. _( d( I6 |# U# G( d1 S! G intArray.set_elem(0, 2);! l# P* n9 m, C4 V( `4 W
int firstElem = intArray.get_elem(0);
4 @ a2 Z1 C$ ~ int* begin = intArray;- Z( N5 K: @' U! Z5 s
} |