2011-08-22 48 views
2

當我和Lua的工作在C#,我想補充屬性,我想和Lua,這樣的註冊方法:C++和Lua:自動註冊功能

// place tile marker 
[LuaExport("settilemarker")] 
public void SetTileMarker(int x, int y) 
{ 
    TileEditor.X = x; 
    TileEditor.Y = y; 
} 

然後,我會用反射在運行時找到所有這些函數並自動註冊它們,併爲每個新函數不必更新一小段代碼。 這也可以用來自動建立一個所有註冊命令清單等容易等

我的問題是,有沒有辦法用C++中的Lua做到這一點?像某種宏,或者某種東西。 這些信息不一定在運行時可用,我只是想方便地將每個函數標記在已定義的位置,並讓它們全部自動註冊,而不是在lua_register(..)s的某個地方有一個長段。

我已經找到了一些似乎能夠爲此生成代碼的工具,但是我希望可能有一種方法除了擊中Build之外不需要任何額外的手動工作。如果不是,我將不得不進一步調查這些工具。順便說一句,使用Visual Studio 2010。

回答

2

C和C++沒有反射。因此,您使用的任何工具至少需要一些手動工作。你將不得不輸入對於你想要輸出的每個功能,或者你將不得不將原型放到特定的位置或其他東西。

有一個list of Lua binding utilities可用。其中一些是半自動的,包括可以讀取C++子集的解析器,併爲它們半自動生成綁定代碼。 SWIG,toLua和toLua ++就是其中之一。其他人需要更多的工作,但要明確地聲明行爲(比如所有權等)要容易一些。

+0

我知道他們沒有反思 - 我只是指出它使得它很容易自動註冊函數,我希望可能有一些類似的簡單方法,不一定在運行時完成,只是不那麼繁瑣爲程序員工作。但是,使用這些公用事業似乎是要走的路。 – tacospice

0

你看過SWIG我已經使用過它,雖然有點複雜,它卻爲你自動化了很多事情。

1

如果您使用Luabind將您的C++函數導出到Lua,您希望編寫的語法與您要編寫的語法相似。

我曾經直接使用Lua C API將Lua與C++集成,但是,自從我發現Luabind以來,我從來沒有這樣做過。

在你的程序初始化中,你可能有這樣的東西。

#include <lua.hpp> 
#include <luabind/luabind.hpp> 

lua_State * L = luaL_newstate(); 
luaL_openlibs(L); 
luabind::open(L); 
luabind::module(L) [ 
    luabind::def("settilemarker", &SetTileMarker) 
]; 

如果SetTileMarker不是一個自由函數,而是一個Foo類的方法,那麼你會這樣做。

luabind::module(L) [ 
    luabind::class_<Foo>("foo") 
     .def("settilemarker", &Foo::SetTileMarker) 
]; 

這是不是能夠到處分發您註冊成爲漂亮的,但我覺得它更容易和更語法不是直接使用Lua的C API平易近人。