// traits 的应用

///////////////////////////////////////////

// traits
template <typename T>
class sigmaTraits
{};

// 特化
template <>
class sigmaTraits<char>
{
public:
	typedef int returnType;
};

template <>
class sigmaTraits<int>
{
public:
	typedef int returnType;
};

template <>
class sigmaTraits<float>
{
public:
	typedef double returnType;
};

template <>
class sigmaTraits<double>
{
public:
	typedef double returnType;
};


///////////////////////////////////////////


#if 0
// char 溢出
template <typename T>
inline T Sigma(const T const* start, const T const* end)
{
	typedef T ReturnType;
	ReturnType s = ReturnType();
	while (start != end)
	{
		s += *start++;
	}

	return s;
}
#endif // 1

#if 1
// 需要 trait 技术
template <typename T>
inline typename sigmaTraits<T>::returnType Sigma(const T const* start, const T const* end)
{
	typedef typename sigmaTraits<T>::returnType ReturnType;
	ReturnType s = ReturnType();
	while (start != end)
	{
		s += *start++;
	}

	return s;
}
#endif // 1

int main()
{
	// 需要 trait 技术才能保证计算结果正确。避免char溢出导致结果错误。
	char str[] = "abc";
	size_t len = strlen(str);
	char* pB = str;
	char* pE = str + len;

	printf("%d", Sigma(pB, pE));
}

  

01-03 06:01