关于萃取的概念,本文不做过多介绍,主要通过一个简单的实例,来说明萃取的技巧。
实例
#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可以表示一个模板,根据需要传入需要的参数;