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