c++——一个萃取的实例

关于萃取的概念,本文不做过多介绍,主要通过一个简单的实例,来说明萃取的技巧。

实例

#ifndef _lua_type_trans_h_
#define _lua_type_trans_h_

extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

// 枚举类型定义(lua.h中定义一致)
typedef enum LuaBaseType
{
	TYPE_LUA_TNONE = -1,        // none
	TYPE_LUA_TNIL = 0,          // nil 
	TYPE_LUA_TBOOLEAN,          // bool
	TYPE_LUA_TLIGHTUSERDATA,    
	TYPE_LUA_TNUMBER,
	TYPE_LUA_TSTRING,
	TYPE_LUA_TTABLE,
	TYPE_LUA_TFUNCTION,
	TYPE_LUA_TUSERDATA,
	TYPE_LUA_TTHREAD,
	TYPE_LUA_NUMTYPES,
} EFieldType;

template<LuaBaseType pt>
struct type_traits {
	typedef void SyntaxType;
};

// 定义萃取模板函数
#define BASE_TYPE_TRAITS(pt, type)\
template<>\
struct type_traits<pt>\
{\
	typedef type SyntaxType;\
};

BASE_TYPE_TRAITS(TYPE_LUA_TBOOLEAN, int)
BASE_TYPE_TRAITS(TYPE_LUA_TNUMBER, double)
BASE_TYPE_TRAITS(TYPE_LUA_TSTRING, const char*)

typedef type_traits<TYPE_LUA_TSTRING>::SyntaxType string_type;
inline string_type StringTypeTrans(lua_State* lua, int index = 0)
{
	string_type stringtype = (string_type)lua_tolstring(lua, index, NULL);
	return stringtype;
}

typedef type_traits<TYPE_LUA_TBOOLEAN>::SyntaxType bool_type;
inline bool_type BoolTypeTrans(lua_State* lua, int index = 0)
{
	bool_type booltype = (bool_type)lua_toboolean(lua, index);
	return booltype;
}

typedef type_traits<TYPE_LUA_TNUMBER>::SyntaxType double_type;
inline double_type NumbersTypeTrans(lua_State* lua, int index = 0)
{
	double_type doubletype = (double_type)lua_tonumber(lua, index);
	return doubletype;
}	

#endif

思路分析:

  • 定义一个enum类型,这里由于使用到了lua库,读者可根据需要自行定义;
  • 定义萃取模板函数type_traits,使用BASE_TYPE_TRAITS宏进行包装,主要定义了c++一些基本类型与enum类型的映射关系;
  • 通过typedef type_traits<T>::SyntaxType type萃取出需要的类型,T可以表示一个模板,根据需要传入需要的参数;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值