0001 #include <typeinfo.h> 0002 0003 /****************************************************************************************** 0004 * 列表、向量等结构内的节点中,可以存放基本类型或构造类型 0005 * 按照本书约定,出于效率的考虑,对于后一情况通常只保存对象的指针 0006 * 因此,在主体结构析构之前,需要首先释放这些成员对象所占的空间 0007 * 此处,借助C++中偏特化技术区分上述两种情况,并做对应处理 0008 ******************************************************************************************/ 0009 0010 template <typename T> struct Cleaner { 0011 static void clean ( T x ) { //相当于递归基 0012 #ifdef _DEBUG 0013 static int n = 0; 0014 if ( 7 > strlen ( typeid ( T ).name() ) ) { //复杂类型一概忽略,只输出基本类型 0015 printf ( "\t<%s>[%d]=", typeid ( T ).name(), ++n ); 0016 print ( x ); 0017 printf ( " purged\n" ); 0018 } 0019 #endif 0020 } 0021 }; 0022 0023 template <typename T> struct Cleaner<T*> { 0024 static void clean ( T* x ) { 0025 if ( x ) { delete x; } //如果其中包含指针,递归释放 0026 #ifdef _DEBUG 0027 static int n = 0; 0028 printf ( "\t<%s>[%d] released\n", typeid ( T* ).name(), ++n ); 0029 #endif 0030 } 0031 }; 0032 0033 template <typename T> void release ( T x ) { Cleaner<T>::clean ( x ); }