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)
技术思想
萃取
技术:给定类型
,萃取出另一类型或值
策略
技术:给定类型
,萃取出算法/动作/行为
.用类模板
来实现.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现