C语言 变长参数的应用 简化多并列条件的方案 判断目标元素是否在变长参数中

C语言 变长参数的应用 简化多并列条件的方案 判断目标元素是否在变长参数中

调用代码

	char cpc[] = {
     "test"};
	//比较字符串:AlgoCharStringCmpFunc,变长个数5
	if (AlgoIn<char *>(cpc, 5, AlgoCharStringCmpFunc, "hello", "world", "this", "is", "test"))
		cout << "test in here" << endl;
	if (AlgoIn<char *>(cpc, 5, AlgoCharStringCmpFunc, "hello", "world", "this", "is", "nothing"))
		cout << "test not in here" << endl;
	//比较字符串,变长个数实际为5,传递4,因此返回为false
	cout << "isIn:" << AlgoIn<char *>("112", 4, AlgoCharStringCmpFunc, "1", "7", "12","67", "112") << endl;

	cout << "compare in end" << endl;

实现代码

//比较target是否在data开始的变长参数内,
//由count指定比较参数个数,
//由cmp函数进行比较,
//毕竟如果你传递两个对象过来,直接用==可能无法比较,
//这样交给比较函数就行了,你比较好了,告诉我谁大谁小即可
template<typename T, typename FuncCmp>
bool AlgoIn(T target, int count, FuncCmp cmp, T data, ...)
{
     
	va_list varList;
	va_start(varList, data);
	//需要注意,这是第一个参数data的位置,后面第一次调用va_arg,就已经指向下一个参数了
	//处理不当就会导致第一个参数取不到
	//因此解决方法有两种,第一种就是我这种方案,第一个参数独立处理,第二种就是va_start的参数取向前一个cmp
	T arg = data;
	bool ret = false;
	int i = 0;
	while (i<count)
	{
     
		if (cmp(target, arg) == 0)
		{
     
			ret = true;
			break;
		}
		arg= va_arg(varList, T);
		i++;
	}
	va_end(varList);
	return ret;
}

其中的FuncCmp可以是常规函数,也可以是伪函数,了解过STL的同学应该都很清楚

你可以仿照下面的写法,构建适合的比较函数

//FuncCmp 比较函数
#define ALGO_FUNC_CMP(type) int (*)(const type &,const type &)
template<typename T>
int AlgoDefaultCmpFunc(const T & t1, const T & t2)
{
     
	if (t1 == t2)
		return 0;
	if (t1 > t2)
		return 1;
	if (t1 < t2)
		return -1;
}
int AlgoCharStringCmpFunc(const char * str1, const char * str2)
{
     
	if (str1 == str2)
		return 0;
	if (str1 == NULL && str2)
		return -1;
	if (str1 && str2 == NULL)
		return 1;
	return strcmp(str1,str2);
}

//伪函数
template<typename T>
class AlgoDefaultComparator
{
     
public:
	int operator()(const T & t1, const T & t2)
	{
     
		if (t1 == t2)
			return 0;
		if (t1 > t2)
			return 1;
		if (t1 < t2)
			return -1;
	}
};

你可能感兴趣的:(C++,开发学习,变长参数,判断是否包含,并列if简化,泛型函数)