2011-11-13 133 views
1

我正在使用Luabind將C++ API綁定到Lua。我有一些不能直接創建的對象,而是必須在另一個線程上創建。目前,我正在通過定義一個「靜態」的成員被稱爲create能產生直到創建對象處理這樣的:Luabind中的自定義構造函數

luabind::class_<Foo>("Foo") 
    .scope 
    [ 
    luabind::def("create", &someCreateMethod, luabind::yield) 
    ] 

這工作,但客戶端API複雜的缺點。對於這些課程,您無法正常創建它們(例如local f = Foo()),而是需要執行local f = Foo.create()

是否可以定義一個實際上不調用C++構造函數的Luabind構造函數,而是返回構造對象的另一個函數(並且可以同時產生)?我試過爲__init__call定義綁定(後者在scope下定義它,而不是它的實例),但是我沒有在任何一種方法上取得成功。

回答

1

Luabind中的構造函數必須是實際的C++類構造函數。所以你只需要處理輕微的API怪異。

如果你感興趣的是能夠使用Foo作爲構造方法,那麼你可以做到這一點。註冊您的C++類FooFooLua到Lua。然後,註冊此someCreateMethod,而不是作爲FooLua的成員,但作爲一個名爲Foo的Lua自由函數。因此,就用戶而言,Foo是Lua類Foo的構造函數。

現在,這會阻止您賦予Foo其他靜態屬性(如成員等)的能力。但是你可以通過使用一些直接的Lua API編碼來實現這一點。您可以創建一個空表Foo併爲其創建一個metatable,它將__index__newindex調用轉發給FooLua。同樣,您可以覆蓋此metatable的__call以將構建轉發到Foo.create

+0

在C++或Lua方面,沒有辦法用'__call'運算符「僞造」它? – Xtapolapocetl

+1

@Xtapolapocetl:Luabind將C++類型存儲爲userdata,因此Lua代碼不會影響其metatables。你可以從C++中戳出Luabind的metatables,但是真的,這是一個小問題,它可以忽略不計。事實上,如果語法*真的困擾你,你可以用Luabind調用對象'FooInternal',並創建一個函數'Foo'來調用'FooInternal.create'函數。用戶可以認爲他們使用的是一個名爲「Foo」的類。 –

+0

@Xtapolapocetl:除了Nicol的評論之外,如果你只用'Foo'來創建對象(即沒有其他的作用域方法),你甚至可以做'Foo = Foo.create'。 – sbk

相關問題