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

// 是否是数字
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行代码,省纸环保 。缺点是没有边界检查,溢出了也不知道,参数的有效性由调用者保证,另外如果项目是按照代码行数给钱的话就亏大发了。:-)

 

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

 

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

posted on 2011-06-30 16:55  megadeath  阅读(526)  评论(3)    收藏  举报