#include <iostream>
using namespace std;
namespace _nmsap1
{
template<typename T>
struct SumFixedTraits;
template<>
struct SumFixedTraits<char>
{
using sumT = int;
static sumT initValue() { return 0; }
};
template<>
struct SumFixedTraits<int>
{
using sumT = __int64;
static sumT initValue() { return 0; }
};
template<>
struct SumFixedTraits<double>
{
using sumT = double;
static sumT initValue() { return 0.0; }
};
template<typename T>
struct MinFixedTraits;
template<>
struct MinFixedTraits<int>
{
using sumT = __int64;
static sumT initValue() { return INT64_MAX; }
};
template<typename sumT, typename T>
struct SumPolicy
{
static void algorithm(sumT &sum, const T& value)
{
sum += value;
}
};
template <typename minT, typename T>
struct MinPolicy
{
static void algorithm(minT& min, const T&value)
{
if (min > value)
min = value;
}
};
template<typename T, typename U = SumFixedTraits<T>,
//typename V = SumPolicy>
template<class, class>class V = SumPolicy>
auto funcsum(const T*begin, const T*end)
{
//using sumT = typename SumFixedTraits<T>::sumT;
//sumT sum = SumFixedTraits<T>::initValue();
typename U::sumT sum = U::initValue();
for (;;)
{
//sum += (*begin);
V<U::sumT, T>::algorithm(sum, *begin);
if (begin == end)
break;
++begin;
}
return sum;
}
}
int main()
{
//char charArr[] = "abc";
//cout << (int)(_nmsap1::funcsum(&charArr[0], &charArr[2])) << endl;
int intArr[] = {10, 30, 5, 50, 20};
cout << (int)(_nmsap1::funcsum<int, _nmsap1::MinFixedTraits<int>, _nmsap1::MinPolicy>(&intArr[0], &intArr[2])) << endl;
return 0;
}
C++ (策略)
于 2021-01-16 23:06:21 首次发布