c++模板实现多参数任意传 - 方法实现

原创 2015年11月21日 10:37:01

游戏中lua脚本中,如果实现了c++调用lua脚本时参数任意传,那真的是爽的一逼。这个是从《c++ primer plua 6th》中看到的,是以方法实现的递归,在另一本书《modern c++ design》中,使用的更高级,是以类的继承实现递归,后面的文章中将会贴出。

利用c++的模板,自己在定个数据结构,重载多个方法去实现不同参数的匹配,装到自己定的数据结构中,最后在对lua的压栈过程中压如不同的参数类型中。

对于自定义类的传入,涉及的代码有点小多,所以这里只贴了基础数据的多参数。自定义类的话有空补上

下面上代码:

#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

enum  LuaParameterType
{
	LPT_NUM = 0,
	LPT_STR,
	LPT_BOOL,
	LPT_CUSTOM,
	LPT_COUNT,
};
struct  LuaParameter
{
	LuaParameterType type;     //类型
	void* value;		       //自定义类型值
	double num;                //number
	bool b;                //bool
	std::string str;          //字符串类型
	std::string typeName;      //在类型为自定义类型时有效
	std::string name;          //预设时用到这个数据
};


std::vector<LuaParameter> mutipleArgsVec;
void insertArg(bool _b)
{
	LuaParameter para;
	para.type = LPT_BOOL;
	para.b = _b;
	mutipleArgsVec.push_back(para);
}
void insertArg(char _c)
{
	LuaParameter para;
	para.type = LPT_STR;
	char tmp[2] = { _c, '\0' };
	para.str = std::string(tmp);
	mutipleArgsVec.push_back(para);
}
void insertArg(const char* _str)
{
	LuaParameter para;
	para.type = LPT_STR;
	para.str = std::string(_str);
	mutipleArgsVec.push_back(para);
}
void insertArg(std::string _str)
{
	LuaParameter para;
	para.type = LPT_STR;
	para.str = std::string(_str);
	mutipleArgsVec.push_back(para);
}
void insertArg(int _num)
{
	LuaParameter para;
	para.type = LPT_NUM;
	para.num = _num;
	mutipleArgsVec.push_back(para);
}
void insertArg(float _num)
{
	LuaParameter para;
	para.type = LPT_NUM;
	para.num = _num;
	mutipleArgsVec.push_back(para);
}

void printData()
{
	for (LuaParameter para : mutipleArgsVec)
	{
		if (para.type == LPT_NUM)
		{
			printf("--- is number:%lf\n", para.num);
		}
		else if (para.type == LPT_STR)
		{
			printf("--- is string:%s\n", para.str.c_str());
		}
		else if (para.type == LPT_BOOL)
		{
			printf("--- is bool:%d\n", (int)para.b);
		}
	}
}

//--------------------- 实现模板的递归 begin ------------------
//definition for 0 parameters -- 无参数时,最后一次递归时会调用,停止递归,实现为空即可
void showArgs() {}

//definition for 1 or more parameters -- 有参数是调用这个函数
template < typename T, typename... Args>
void showArgs(T value, Args... args)
{
	insertArg(value);
	showArgs(args...);
}
//--------------------- 实现模板的递归 end ------------------

void testArgs()
{
	mutipleArgsVec.clear();
	showArgs(123, "aaa", 23.23f, 'c', true);
	printData();
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

c++模板实现多参数任意传 - 类实现

之前写的有篇文章是用方法实习的变长参数,这边就是用类实现的,更加高大上,这样就可以对不同的实例对象进行处理。  下面是《深入理解c++11》书中的截图 下面是自己实现的代码 //-----...

在Android 中实现多参数文件和数据上传

上代码: /** * 可传入多张图片和参数 * * @param actionUrl * 发送地址 * @param params * ...

利用html5的FileReader对象实现图片预览,利用FormData对象结合struts2实现无刷新文件上传(多参数)

1、页面内容如下:                                                         文件内容变化就调用getImgUrl方法,获取变化后的文件,然...
  • lizi530
  • lizi530
  • 2016年06月17日 10:48
  • 1987

C语言实现自定义多参数函数

// // main.c // 自定义多参数函数 // // Created by MacroHong on 14-2-19. // Copyright (c) 2014年 Macro. Al...
  • Macro_13
  • Macro_13
  • 2014年08月23日 10:52
  • 12401

Mybatis多参数查询与列表查询不同方式实现

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka一、查询所有数据,返回List查询出列表,也就是返回list, 在我们这个例子中也就是 List...

SSM搭建-Mybatis基于注解实现增删查改和多参数列表查询(20)

Mybatis基于注解实现增删查改和多参数列表查询
  • nimiky
  • nimiky
  • 2016年11月02日 18:59
  • 1463

Mybatis基于注解实现增删查改和多参数列表查询

在【Mybatis】Mybatis入门概述及第一个Mybatis实例实现增删改查 和【Mybatis】Mybatis接口编程方式实现增删改查 演示了如何使用XML来操作My...

23、SSM框架-Mybatis基于注解实现增删查改和多参数列表查询(5)

在前面的文章中演示了如何使用XML来操作Mybatis实现CRUD,但是大量的XML配置文件的编写是非常烦人的。因此Mybatis也提供了基于注解的配置方式,下面我们来演示一下使用接口加注解来实现CR...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++模板实现多参数任意传 - 方法实现
举报原因:
原因补充:

(最多只允许输入30个字)