2011-11-13 1 views
1

Luabind를 사용하여 Lua에 C++ API를 바인딩하고 있습니다. 직접 생성 할 수없는 개체가 있지만 다른 스레드에서 만들어야합니다.Luabind의 사용자 정의 생성자

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

이 작동하지만 클라이언트 API를 복잡 단점이있다 : 저는 현재 객체가 생성 될 때까지 산출 create라는 "정적"멤버를 정의하여이 문제를 처리하고 있습니다. 이 클래스의 경우 정상적으로 만들 수는 없지만 (예 : local f = Foo()) local f = Foo.create()해야합니다.

실제로 C++ 생성자를 호출하지 않는 Luabind 생성자를 정의 할 수 있습니까? 대신 생성 된 객체를 반환하는 다른 함수를 정의 할 수 있습니까? 나는 __init__call에 대한 바인딩을 정의하려고 시도했다. (후자 인 scope은 인스턴스가 아니라 클래스에 정의했다.)하지만 어느 방법으로도 성공하지 못했다.

답변

1

Luabind의 생성자는 실제 C++ 클래스 생성자 여야합니다. 따라서 약간의 API 괴상함을 처리해야합니다.

Foo을 생성자 방법으로 사용할 수 있다면이 작업을 수행 할 수 있습니다. Lua에 FooLua으로 C++ 클래스 Foo을 등록하십시오. 그런 다음이 someCreateMethodFooLua의 구성원이 아닌 Foo이라는 Lua 무료 함수로 등록하십시오. 따라서 사용자에 관한 한 Foo은 Lua 클래스 Foo의 생성자입니다.

이제 회원들과 같은 다른 정적 속성을 Foo에게 줄 수 없습니다. 그러나 직접 Lua API 코딩을 사용하여이를 수행 할 수 있습니다. 빈 테이블 Foo을 만들고이 테이블에 대해 __index__newindexFooLua으로 전달하는 메타 테이블을 만들 수 있습니다. 마찬가지로이 메타 테이블의 __call을 재정 의하여 구성을 Foo.create으로 전달할 수 있습니다.

+0

그리고 C++이나 루아 측에서도'__call' 연산자로 "가짜"할 수는 없습니까? – Xtapolapocetl

+1

@Xtapolapocetl : Luabind는 C++ 유형을 userdata로 저장하므로 루아 코드는 메타 테이블에 영향을 줄 수 없습니다. C++에서 Luabind의 메타 테이블을 찌를 수는 있지만 실제로 이것은 무시할 수없는 사소한 문제입니다. 사실, 구문이 * 정말로 * 귀찮다면 Luabind로 객체'FooInternal'을 호출하고'FooInternal.create' 함수를 호출하는'Foo' 함수를 만들면됩니다. 사용자는 'Foo'라는 클래스를 사용하고 있다고 생각할 수 있습니다. –

+0

@Xtapolapocetl : 니콜 (Nicol)의 의견 외에도'Foo '만 사용하여 객체를 만드는 경우 (즉, 다른 범위 방법이없는 경우)'Foo = Foo.create '를 수행 할 수도 있습니다. – sbk

관련 문제