我試圖使用一個Lua文件作爲配置或ini。我成功了,但是我的解決方案讓我感到不快。具體而言,get_double
,get_int
和get_string
功能需要以可重複使用的方式完成。通用解決方案從lua文件獲取簡單值到C++
我遇到了創建沒有參數的函數模板的問題。 此外,我不知道如何推廣lua_is...
和lua_to...
。我的想法是對我們if(is_same<T,double>::value) return (double)lua_isnumber(L,-1);
,但它沒有奏效。
這裏是工作代碼:
main.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;
}
config.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
我覺得應該是維基,但我'm不確定如何進入wiki –