gpt4 book ai didi

c++ - 从lua文件获取简单值到c++的通用解决方案

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:01 24 4
gpt4 key购买 nike

我正在尝试使用 Lua 文件作为配置或 ini。我成功了,但我的解决方案激怒了我。具体来说,get_double , get_intget_string功能需要以可重用的方式完成。

我在创建没有参数的函数模板时遇到了问题。另外,我不确定如何概括 lua_is...lua_to... .我的想法是给我们if(is_same<T,double>::value) return (double)lua_isnumber(L,-1);但它没有用。

这是工作代码:

主.cc:

#include <iostream>
#include <lua.hpp>

using namespace std;

class Lua_vm
{
private:
lua_State *L;
public:
double get_double(const char *var_name) {
lua_getglobal(L,var_name);
if (!lua_isnumber(L,-1)) {
cout << "error: " << var_name << " is of a wrong type\n";
}
return (double)lua_tonumber(L,-1);
lua_pop(L,1);
}
int get_int(const char *var_name) {
lua_getglobal(L,var_name);
if (!lua_isnumber(L,-1)) {
cout << "error: " << var_name << " is of a wrong type\n";
}
return (int)lua_tonumber(L,-1);
lua_pop(L,1);
}
string get_string(const char *var_name) {
lua_getglobal(L,var_name);
if (!lua_isstring(L,-1)) {
cout << "error: " << var_name << " is of a wrong type\n";
}
return string(lua_tostring(L,-1));
lua_pop(L,1);
}
Lua_vm(const char *lua_config_filename) {
L = lua_open();
if (luaL_loadfile(L, lua_config_filename) || lua_pcall(L, 0,0,0)) {
cout << "error: " << lua_tostring(L,-1) << "\n";
}
lua_pushnil(L);
}
~Lua_vm() {
lua_close(L);
}
};
int main(int argc, char** argv)
{
Lua_vm lvm("config.lua");

cout << "vol is " << lvm.get_double("vol") << "\n";
cout << "rho is " << lvm.get_int("rho") << "\n";
cout << "method is " << lvm.get_string("method") << "\n";

return 0;
}

配置.lua:

method = "cube"
len = 3.21
rho = 13
vol = len*len*len
mass = vol*rho

它用 g++ main.C -I/usr/include/lua5.1/ -llua5.1 ; ./a.out 编译

最佳答案

这是我为此目的使用的代码(更多:http://tom.rethaller.net/wiki/projects/prologue/lua)

class LuaState
{
private:
lua_State *L;
// [...]

public:
// get function
template<typename T>
T get(const char * varname) {
char temp[64];
memset(temp, 0, sizeof(temp));
int i=0;
int j=0;
int n=0;
while (varname[i] != '\0') {
char c = varname[i];
if (c == '.') {
if (n == 0)
lua_getglobal(L, temp);
else
lua_getfield(L, -1, temp);
++n;
memset(temp, 0, sizeof(temp));
j = 0;

if (lua_isnil(L, -1))
return 0;
}
else {
temp[j] = c;
++j;
}
++i;
}
if (n == 0)
lua_getglobal(L, temp);
else
lua_getfield(L, -1, temp);
return lua_get<T>();
}

// Generic get
template<typename T>
T lua_get() {
return 0;
}

// Specializations
template <> float lua_get<float>() {
return lua_tonumber(L, -1);
}
template <> double lua_get<double>() {
return lua_tonumber(L, -1);
}
template <> bool lua_get<bool>() {
return lua_toboolean(L, -1);
}
template <> int lua_get<int>() {
return lua_tointeger(L, -1);
}
template <> unsigned int lua_get<unsigned int>() {
return (unsigned int)lua_tonumber(L, -1);
}
template <> const char * lua_get<const char *>() {
return lua_tostring(L, -1);
}
};

-- 编辑 - 为了说明如何使用它,您只需调用:

bool use_blur = lua_state.get<bool>("config.render.effects.blur");

获取以下值:

config = {
render = {
effects = {
blur = false,
}
}
}

关于c++ - 从lua文件获取简单值到c++的通用解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10845870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com