泛型编程实际项目中的应用

来源:转载

最近在做一个文本处理项目中,需要对一些字符进行判断,看这个字符是否是数字,英文或是标点符号,于是写下了如下的代码。

// 是否是数字bool _IsNumber( const wchar_t & ch ){ const wchar_t ArrayOfNumbers[] = {L"0123456789"}; for (unsigned int i = 0; i < ARRAYSIZE(ArrayOfNumbers) - 1; ++i) { if (ch == ArrayOfNumbers[i]) { return true; } } return false;}// 是否是英文字符bool _IsEnglish( const wchar_t & ch ){ const wchar_t ArrayOfEnglish[] = {L"aeioubcdfghjklmnpqrstvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"}; for (unsigned int i = 0; i < ARRAYSIZE(ArrayOfEnglish) - 1; ++i) { if (ch == ArrayOfEnglish[i]) { return true; } } return false;}// 是否是结束标点bool _IsEndPunctuation( const wchar_t & ch ){ const wchar_t ArrayOfEndPunctuation[] = {L"。?!.?!"}; for (unsigned int i = 0; i < ARRAYSIZE(ArrayOfEndPunctuation) - 1; ++i) { if (ch == ArrayOfEndPunctuation[i]) { return true; } } return false;}

 

类似这样的代码还有很多,通过对比发现其实这样的函数算法基本上是相同的,可以通过泛型来解决,于是用以下这个模板进行替换。

template <typename ITERATOR, typename ARRAY, typename ELEMENT>inline bool _IsMatchArrayElement(ITERATOR begin, ITERATOR end, ARRAY array, ELEMENT element){ for (; begin != end; ++begin) { if (element == array[begin]) { return true; } } return false;}

 

于是原先的函数就变成了如下:

// 是否是数字bool _IsNumber( const wchar_t & ch ) { const wchar_t ArrayOfNumbers[] = {L"0123456789"}; return _IsMatchArrayElement(size_t(), ARRAYSIZE(ArrayOfNumbers) - 1, ArrayOfNumbers, ch);}// 是否是英文字符bool _IsEnglish( const wchar_t & ch ) { const wchar_t ArrayOfEnglish[] = {L"aeioubcdfghjklmnpqrstvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"}; return _IsMatchArrayElement(size_t(), ARRAYSIZE(ArrayOfEnglish) - 1, ArrayOfEnglish, ch);}// 是否是结束标点bool _IsEndPunctuation( const wchar_t & ch ){ const wchar_t ArrayOfEndPunctuation[] = {L"。?!.?!"}; return _IsMatchArrayElement(size_t(), ARRAYSIZE(ArrayOfEndPunctuation) - 1, ArrayOfEndPunctuation, ch);}

 

模板把算法抽象出来,这样的话就简单多了。

 

“泛型编程是算法导向的,以算法为中心,逐渐将其所涉及的概念内涵模糊化、外延扩大化,并将其所涉及的运算抽象化、一般化,从而提高算法的可重用性。”

 

这里也说一下这种方法的优缺点:优点是每个函数写法上简单很多,去掉了算法上的冗余且不损失性能,节省了N行代码,省纸环保 。缺点是没有边界检查,溢出了也不知道,参数的有效性由调用者保证,另外如果项目是按照代码行数给钱的话就亏大发了。:-)

 

对于这类问题应该还有更好地解决方法,欢迎各位朋友在这里讨论。

 

这是本人第一次在博客园发博文,希望能够在这里结识更多新朋友。


分享给朋友:
您可能感兴趣的文章:
随机阅读: