查看单个帖子
  #16 (permalink)  
旧 2008-02-26
Dd 的头像
Dd Dd 当前离线
普通会员
 
注册日期: 2002-10-16
住址: 上海
帖子: 49
Dd 正向着好的方向发展
发送 MSN 消息给 Dd
默认 回复: 基于模板参数类型的“字面常量选择”

引用:
作者: Dd 查看帖子
Elminster:正解!和我现在的做法基本一致,就连名字(selector)都很像

那么,现在解决了char/wchar_t字面常量问题,那么再加大点难度吧。同样的问题如何处理“字面常量字符串”呢?例如,对于以下代码中的“字面字符串”:

代码:
characterData(void *userData, const XML_Char *s, int len) {...}

关于字符串常量的选择,我至今没有想到啥好办法。不过关于“字符选择”我做了一个简单的类,或许对其他人也有帮助:

代码:
// // CAsciiCharacters // /* [dev] * http://tongj.bokee.com/1649370.html */ #define __M_BASE_ASCII_Definition( TChar, prefix ) \ static const TChar \ NUL = prefix##'\0', /* Null char */ \ /* 001 SOH(Start of Header) */ \ /* 002 STX(Start of Text) */ \ /* 003 ETX(End of Text) */ \ /* 004 EOT(End of Transmission) */ \ /* 005 ENQ(Enquiry) */ \ /* 006 ACK(Acknowledgment) */ \ BEL = prefix##'\a', /* Bell */ \ BS = prefix##'\b', /* Backspace */ \ HT = prefix##'\t', /* Horizontal tab */ \ LF = prefix##'\n', /* Line feed */ \ VT = prefix##'\v', /* Vertical tab */ \ FF = prefix##'\f', /* Form feed */ \ CR = prefix##'\r', /* Carriage return */ \ /* 014 SO(Shift Out) */ \ /* 015 SI(Shift In) */ \ /* 016 DLE(Data Link Escape) */ \ /* 017 DC1(XON)(Device Control 1) */ \ /* 018 DC2(Device Control 2) */ \ /* 019 DC3(XOFF)(Device Control 3) */ \ /* 020 DC4(Device Control 4) */ \ /* 021 NAK(Negative Acknowledgement) */ \ /* 022 SYN(Synchronous Idle) */ \ /* 023 ETB(End of Trans. Block) */ \ /* 024 CAN(Cancel) */ \ /* 025 EM(End of Medium) */ \ /* 026 SUB(Substitute) */ \ /* 027 ESC(Escape) */ \ /* 028 FS(File Separator) */ \ /* 029 GS(Group Separator) */ \ /* 030 RS(Request to Send)(Record Separator) */ \ /* 031 US(Unit Separator) */ \ space = prefix##' ', \ exclamation_mark = prefix##'!', \ double_quote = prefix##'\"', \ number_sign = prefix##'#', \ dollar_sign = prefix##'$', \ percent = prefix##'%', \ ampersand = prefix##'&', \ single_quote = prefix##'\'', \ left_parenthesis = prefix##'(', \ right_parenthesis = prefix##')', \ asterisk = prefix##'*', \ plus = prefix##'+', \ comma = prefix##',', \ minus = prefix##'-', \ dot = prefix##'.', \ forward_slash = prefix##'/', \ num_0 = prefix##'0', \ num_1 = prefix##'1', \ num_2 = prefix##'2', \ num_3 = prefix##'3', \ num_4 = prefix##'4', \ num_5 = prefix##'5', \ num_6 = prefix##'6', \ num_7 = prefix##'7', \ num_8 = prefix##'8', \ num_9 = prefix##'9', \ colon = prefix##':', \ semi_colon = prefix##';', \ less_than = prefix##'<', \ equal_sign = prefix##'=', \ greater_than = prefix##'>', \ question_mark = prefix##'?', \ at_symbol = prefix##'@', \ letter_A = prefix##'A', \ letter_B = prefix##'B', \ letter_C = prefix##'C', \ letter_D = prefix##'D', \ letter_E = prefix##'E', \ letter_F = prefix##'F', \ letter_G = prefix##'G', \ letter_H = prefix##'H', \ letter_I = prefix##'I', \ letter_J = prefix##'J', \ letter_K = prefix##'K', \ letter_L = prefix##'L', \ letter_M = prefix##'M', \ letter_N = prefix##'N', \ letter_O = prefix##'O', \ letter_P = prefix##'P', \ letter_Q = prefix##'Q', \ letter_R = prefix##'R', \ letter_S = prefix##'S', \ letter_T = prefix##'T', \ letter_U = prefix##'U', \ letter_V = prefix##'V', \ letter_W = prefix##'W', \ letter_X = prefix##'X', \ letter_Y = prefix##'Y', \ letter_Z = prefix##'Z', \ left_bracket = prefix##'[', \ back_slash = prefix##'\\', \ right_bracket = prefix##']', \ caret = prefix##'^', \ underscore = prefix##'_', \ interpunct = prefix##'`', \ letter_a = prefix##'a', \ letter_b = prefix##'b', \ letter_c = prefix##'c', \ letter_d = prefix##'d', \ letter_e = prefix##'e', \ letter_f = prefix##'f', \ letter_g = prefix##'g', \ letter_h = prefix##'h', \ letter_i = prefix##'i', \ letter_j = prefix##'j', \ letter_k = prefix##'k', \ letter_l = prefix##'l', \ letter_m = prefix##'m', \ letter_n = prefix##'n', \ letter_o = prefix##'o', \ letter_p = prefix##'p', \ letter_q = prefix##'q', \ letter_r = prefix##'r', \ letter_s = prefix##'s', \ letter_t = prefix##'t', \ letter_u = prefix##'u', \ letter_v = prefix##'v', \ letter_w = prefix##'w', \ letter_x = prefix##'x', \ letter_y = prefix##'y', \ letter_z = prefix##'z', \ left_brace = prefix##'{', \ vertical_bar = prefix##'|', \ right_brace = prefix##'}', \ tilde = prefix##'~'; \ /* 127 DEL(delete) */ template<typename T> class CAsciiCharacters {}; template<> class CAsciiCharacters<char> { public: __M_BASE_ASCII_Definition( char, (char) ) }; template<> class CAsciiCharacters<wchar_t> { public: __M_BASE_ASCII_Definition( wchar_t, L ) };
例如用法:

代码:
template<typename TChar> class CBasicTextWriter { static const TChar s_chDelimiter = CAsciiCharacters<TChar>::space; }
回复时引用此帖