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)技术思想
萃取技术:给定类型,萃取出另一类型或值
策略技术:给定类型,萃取出算法/动作/行为.用类模板来实现.

posted @   zjh6  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示