正確地調用字符串相關的函數(第一部分)

發表于:2007-07-01來源:作者:點擊數: 標簽:
即便在常規的程序 開發 過程中, 程序員 也常常會碰到調用字符串函數方面的困難。注意,這里的字符串函數是指有關字符指針操作相關的函數。例如,我們現有這么一個函數:reverse_string: templatelt; class CharTypegt; void reverse_string( const CharTyp


即便在常規的程序開發過程中,程序員也常常會碰到調用字符串函數方面的困難。注意,這里的字符串函數是指有關字符指針操作相關的函數。例如,我們現有這么一個函數:reverse_string:

template< class CharType>
void reverse_string( const CharType * strDest)
{
int nLength = /* what should we call here? */;
int idxFirst = 0;
int idxLast = nLength - 1;
while ( idxFirst < idxLast)
{
std::swap( strDest[ idxFirst], strDest[ idxLast];
++ idxFirst;
-- idxLast;
)
}
在/* what should we call here? */位置,我們使用strlen來調用const char *字符串,使用wcslen來調用const wchar_t *字符串。



解決方法是建立一個t_strlen函數,如下所示:

template< class CharType>
int t_strlen( const CharType * str)
{
return strlen( str);
}

int t_strlen( const wchar_t * str)
{
return wcslen( str);
}
開始看上面代碼時,可能會覺得很繁瑣,因為我們必需把相關的標號(int strlen( const char *和int wcslen( const char *))與每一個函數相匹配。

這里提供了一種調用字符串函數的簡單方法。這一方法很通用,它適用于幾個字符串函數操作,特別是它們共用或返回相同參數的時候。例如:

適用于strlen/wcslen.
適用于 strcpy/wcscpy.
適用于 strdup/wcsdup.
假設有兩個字符串函數,你將定義一個宏,如:

#define t_functionname( CharType, parameters)
string_function_<noofparameters>params< CharType, return_type>(
function_for_char, function_for_wchar_t, parameters)

// Examples

// strlen, wcslen pair
// they each have one parameter, and return an ’int’
#define t_strlen( CharType, strVal)
string_function_1param< CharType, int>( strlen, wcslen, strVal)

// strcpy, wcscpy
// they each have two parameters, and return a pointer to a string
#define t_strcpy( CharType, param1, param2)
string_function_2params< CharType, CharType*>( strcpy, wcscpy, param1, param2)

// strncpy, wcsncpy
// they each have three parameters, and return a pointer to a string
#define t_strncpy( CharType, param1, param2, param3)
string_function_3params< CharType, CharType*>( strncpy, wcsncpy, param1, param2, param3)
定義這一宏以后,在程序中調用它就會非常地簡單,如: 

template< class CharType>
void reverse_string( const CharType * strDest)
{
int nLength = t_strlen( CharType, strDest);
// . . . same as before . . .
}
下面的代碼的功能是正確地調用字符串相關的函數。下一部分,我們將會討論string_function_xparams 的用途,然后為你提供一系列的宏,你可以在<string.h>頭文件中調用這些宏。

/////////////////////////////////////////////////////////
// one parameter

template&lt; class CharType, class ReturnType, class CharFunction, class WchartFunction, class Param1&gt;
ReturnType string_function_1param_helper( CharFunction funcChar, WchartFunction funcWchart, Param1 param1, const wchar_t *)
{
return funcWchart( param1);
}

template&lt; class CharType, class ReturnType, class CharFunction, class WchartFunction, class Param1&gt;
ReturnType string_function_1param_helper( CharFunction funcChar, WchartFunction funcWchart, Param1 param1, ...)
{
return funcChar( param1);
}


template&lt; class CharType, class ReturnType, class CharFunction, class WchartFunction, class Param1&gt;
ReturnType string_function_1param( CharFunction funcChar, WchartFunction funcWchart, Param1 param1)
{
return string_function_1param_helper&lt; CharType, ReturnType, CharFunction, WchartFunction, Param1&gt;(
funcChar, funcWchart, param1, ( const CharType *)NULL);


/////////////////////////////////////////////////////////
// two parameters

template&lt; class CharType, class ReturnType, class CharFunction, class WchartFunction, class Param1, class Param2&gt;
ReturnType string_function_2params_helper(
CharFunction funcChar,
WchartFunction funcWchart,
Param1 param1,
Param2 param2, const wchar_t *)
{
return funcWchart( param1, param2);
}

template&lt; class CharType, class ReturnType, class CharFunction, class WchartFunction, class Param1, class Param2&gt;
ReturnType string_function_2params_helper(
CharFunction funcChar,
WchartFunction funcWchart,
Param1 param1,
Param2 param2, ...)
{
return funcChar( param1, param2);
}


template&lt; class CharType, class ReturnType, class CharFunction, class WchartFunction, class Param1, class Param2&gt;
ReturnType string_function_2params(
CharFunction funcChar,
WchartFunction funcWchart,
Param1 param1,
Param2 param2)
{
return string_function_2params_helper&lt; CharType, ReturnType, CharFunction, WchartFunction, Param1&gt;(
funcChar, funcWchart, param1, param2, ( const CharType *)NULL);
}



/////////////////////////////////////////////////////////
// three parameters

template< class CharType, class ReturnType, class CharFunction, class WchartFunction, class Param1, class Param2, class Param3>
ReturnType string_function_3params_helper(
CharFunction funcChar,
WchartFunction funcWchart,
Param1 param1,
Param2 param2,
Param3 param3, const wchar_t *)
{
return funcWchart( param1, param2, param3);
}

template< class CharType, class ReturnType, class CharFunction, class WchartFunction, class Param1, class Param2, class Param3>
ReturnType string_function_3params_helper(
CharFunction funcChar,
WchartFunction funcWchart,
Param1 param1,
Param2 param2,
Param3 param3, ...)
{
return funcChar( param1, param2, param3);
}


template< class CharType, class ReturnType, class CharFunction, class WchartFunction, class Param1, class Param2, class Param3>
ReturnType string_function_3params(
CharFunction funcChar,
WchartFunction funcWchart,
Param1 param1,
Param2 param2,
Param3 param3)
{
return string_function_3params_helper< CharType, ReturnType, CharFunction, WchartFunction, Param1>(
funcChar, funcWchart, param1, param2, param3, ( const CharType *)NULL);
}

/////////////////////////////////////////////////////////
// four parameters

template< class CharType, class ReturnType, class CharFunction, class WchartFunction, class Param1, class Param2, class Param3, class Param4>
ReturnType string_function_4params_helper(
CharFunction funcChar,
WchartFunction funcWchart,
Param1 param1,
Param2 param2,
Param3 param3,
Param4 param4, const wchar_t *)
{
return funcWchart( param1, param2, param3, param4);
}

template< class CharType, class ReturnType, class CharFunction, class WchartFunction, class Param1, class Param2, class Param3, class Param4>
ReturnType string_function_4params_helper(
CharFunction funcChar,
WchartFunction funcWchart,
Param1 param1,
Param2 param2,
Param3 param3,
Param4 param4, ...)
{
return funcChar( param1, param2, param3, param4);
}


template< class CharType, class ReturnType, class CharFunction, class WchartFunction, class Param1, class Param2, class Param3, class Param4>
ReturnType string_function_4params(
CharFunction funcChar,
WchartFunction funcWchart,
Param1 param1,
Param2 param2,
Param3 param3,
Param4 param4)
{
return string_function_4params_helper< CharType, ReturnType, CharFunction, WchartFunction, Param1>(
funcChar, funcWchart, param1, param2, param3, param4, ( const CharType *)NULL);
}

/////////////////////////////////////////////////////////
// five parameters

template< class CharType, class ReturnType, class CharFunction, class WchartFunction, class Param1, class Param2, class Param3, class Param4, class Param5>
ReturnType string_function_5params_helper(
CharFunction funcChar,
WchartFunction funcWchart,
Param1 param1,
Param2 param2,
Param3 param3,
Param4 param4,
Param5 param5, const wchar_t *)
{
return funcWchart( param1, param2, param3, param4, param5);
}

template< class CharType, class ReturnType, class CharFunction, class WchartFunction, class Param1, class Param2, class Param3, class Param4, class Param5>
ReturnType string_function_5params_helper(
CharFunction funcChar,
WchartFunction funcWchart,
Param1 param1,
Param2 param2,
Param3 param3,
Param4 param4,
Param5 param5, ...)
{
return funcChar( param1, param2, param3, param4, param5);
}


template< class CharType, class ReturnType, class CharFunction, class WchartFunction, class Param1, class Param2, class Param3, class Param4, class Param5>
ReturnType string_function_5params(
CharFunction funcChar,
WchartFunction funcWchart,
Param1 param1,
Param2 param2,
Param3 param3,
Param4 param4,
Param5 param5)
{
return string_function_5params_helper< CharType, ReturnType, CharFunction, WchartFunction, Param1>(
funcChar, funcWchart, param1, param2, param3, param4, param5, ( const CharType *)NULL);
}


原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97