关闭

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

标签: c++模板递归多参数
456人阅读 评论(0) 收藏 举报
分类:

游戏中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();
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

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

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

实现一个三维数组模版CArray3D,可以用来生成元素为任意类型变量的三维数组

描述 实现一个三维数组模版CArray3D,可以用来生成元素为任意类型变量的三维数组,使得下面程序输出结果是: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,...
  • nemoyy
  • nemoyy
  • 2016-04-13 10:41
  • 1255

c++::用模板实现List

我在用模板实现List的时候有很多奇奇怪怪的错误,以下我分享出来共勉,希望大家不要掉到和我一样的洞里。   1)因为使用的是模板,所以在每个需要换类型的地方都换成模板参数T(我用的是T,读者可自己定...
  • lalu58
  • lalu58
  • 2016-12-09 14:52
  • 1298

Asp.Net实现URL重写,支持任意扩展名及无扩展名,多参数

实现的效果 最终可以用12345.html 替换 show.aspx?id=12345这样的地址访问 也可以实现百度空间的 http://hi.baidu.com/wu1987116 替换...
  • jackiehome
  • jackiehome
  • 2013-02-20 17:27
  • 4081

c++实现类似Common Lisp的多参数加法和比较

在CL里我们可以这样: 1 $ sbcl 2 * (+ 1 2 3) 3 6 4 * () 5 T 6 * () 7 NIL 8 * 从简单的方面看, CL的+和 所以...
  • u014625500
  • u014625500
  • 2014-05-27 22:19
  • 269

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

上代码: /** * 可传入多张图片和参数 * * @param actionUrl * 发送地址 * @param params * ...
  • puhaiyang
  • puhaiyang
  • 2015-08-03 17:43
  • 1250

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

1、页面内容如下:                         ...
  • lizi530
  • lizi530
  • 2016-06-17 10:48
  • 2326

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

  • 2015-05-13 09:27
  • 6KB
  • 下载

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

  • 2015-05-15 15:24
  • 13KB
  • 下载

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

本文要实现Mybatis多参数查询与列表查询不同方式实现,以一个实例来说明。 本文示例工程下载 一、查询所有数据,返回List 查询出列表,也就是返回list, 在我们这个例子中...
  • bvhsdu
  • bvhsdu
  • 2015-05-13 20:49
  • 117
    博客专栏
    个人资料
    • 访问:480110次
    • 积分:7079
    • 等级:
    • 排名:第3748名
    • 原创:243篇
    • 转载:27篇
    • 译文:0篇
    • 评论:136条
    座右铭

    忠于内心,修炼坚持

    --Wilker_Yun