C++类模板策略技术
策略(policy)技术中的算法策略
//函数模板
template <typename T,typename U = 特征<T> >
auto 函数(const T* begin, const T* end)
{
typename U::sumT sum = U::initValue();
for (;;)
{
sum += (*begin);//可抽象该步.
if (begin == end)
break;
++begin;
}//
return sum;
}
现在,加上策略.
//求和策略类以实现求和算法.
struct SumPolicy
{//关键就是(类/构+静态函数)主要`函数模板`不能作模板参数.
//静态成员函数模板
template <typename sumT, typename T> //sumT是和值类型,T是数组元素类型
static void 算法(sumT& sum, const T& value) //策略类核心算法
{
sum += value; //求和
}
};
template <typename T, typename U = 特征<T> ,typename V = SumPolicy>
auto 函数(const T* begin, const T* end)
{
typename U::sumT sum = U::initValue();
for (;;)
{
V::算法(sum, *begin);
if (begin == end)
break;
++begin;
}//end for
return sum;
}
调用
char aa[] = "abc";
cout << (int)(函数(&aa[0], &aa[2])) << endl;
最小值策略
template <typename T>
struct MinFixedTraits;
template<>
struct MinFixedTraits<int>
{
using sumT = int; //求最小值,结果类型与元素类型相同即可,为了名字统一,都用sumT这个名字
static sumT initValue() { return INT_MAX; }
//INT_MAX:整型最大值,任何一个数组元素都不会被这个值更大
//因此可以顺利的找到数组元素中的最小值,参见MinPolicy::算法
};
//求最小值策略类
struct MinPolicy
{
template <typename minT, typename T>
static void 算法(minT& min, const T& value)
{
if (min > value)min = value;
}
};
调用
int ab[] = { 10,15,20 };
cout << (int)(函数<int, MinFixedTraits<int>, MinPolicy>(&ab[0], &ab[2])) << endl;
用类模板:
template <typename sumT, typename T>
struct SumPolicy
{
//静态成员函数模板
static void 算法(sumT& sum, const T& value) //策略类的核心算法
{
sum += value; //求和
}
};
//求最小值策略类
template <typename minT, typename T>
struct MinPolicy
{
static void 算法(minT& min, const T& value)
{
if (min > value)min = value;
}
};
//函数函数模板
template <typename T, ypename U = 特征<T> ,template<class,class> class V = SumPolicy //这里class也可以写成typename
>
auto 函数(const T* begin, const T* end)
{
typename U::sumT sum = U::initValue();
//typename 特征<char>::sumT sum = 特征<char>::initValue();
//int sum = 0;
for (;;)
{
V<U::sumT,T>::算法(sum, *begin); //捋一下:T是数组成员类型,U是固定萃取(fixed traits)类模板,
//从中可以提取出结算的结果类型(U::sumT)以及结果的初值,
//V是策略类模板,用于实现具体算法(求和,求最小值等)
if (begin == end)break;
++begin;
}//end for
return sum;
}
调用
int ab[] = { 10,15,20 };
cout << (int)(函数<int, MinFixedTraits<int>, MinPolicy>(&ab[0], &ab[2])) << endl;
萃取(trait)技术与策略(policy)技术思想
萃取技术:给定类型,萃取出另一类型或值
策略技术:给定类型,萃取出算法/动作/行为.用类模板来实现.
浙公网安备 33010602011771号