2011-08-22 7 views
2
내가, 내가 루아, 이런 일에 등록하고 싶은 방법에 속성을 추가 할 C#에서 루아와 함께 일하는

: 난 반사를 사용하는 것,C++과 루아 : 자동 기능을 등록

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

다음 런타임에 이러한 모든 기능을 찾아 새로운 기능마다 업데이트 할 필요가없는 짧은 코드로 자동으로 등록합니다. 이것은 또한 등록 된 모든 명령의 목록을 쉽게 자동으로 작성하는 데 사용할 수 있습니다.

제 질문은 C++의 루아에서이 작업을 수행 할 수있는 방법이 있습니까? 어떤 종류의 매크로처럼. 런타임에 정보를 사용할 수있는 것은 아니며, lua_register (..) 어딘가에 하나의 긴 섹션이있는 대신 정의 된 위치에 각 함수를 표시하고 편리하게 모든 함수를 자동으로 등록 할 수있는 편리함을 원합니다.

나는이 코드를 생성 할 수있는 것으로 보이는 몇 가지 도구를 이미 찾았지만 Build를 수행하는 것 외에 별도의 수동 작업이 필요하지 않을 것으로 기대하고있었습니다. 그렇지 않은 경우 해당 도구를 자세히 조사해야합니다.

그런데 Visual Studio 2010을 사용합니다.

답변

2

C 및 C++에는 리플렉션이 없습니다. 따라서 사용하는 도구는 최소한 수동 작업이 필요합니다. 내보내려는 모든 함수에 대해 을 입력해야합니다. 그렇지 않으면 프로토 타입을 특수한 위치 나 다른 곳에 넣어야합니다.

사용할 수있는 번호는 list of Lua binding utilities입니다. 그 중 일부는 C++의 일부 하위 집합을 읽을 수있는 파서를 포함하여 반자동이며 세미 자동 생성 기능을 통해 바인딩 코드가 생성됩니다. SWIG, toLua 및 toLua ++가이 중 하나입니다. 다른 것들은 더 많은 작업이 필요하지만 명시 적으로 동작을 명시하는 것이 더 쉽습니다 (소유권 등).

+0

리플렉션이 없다는 것을 알고 있습니다. 기능을 자동 등록하는 것이 매우 쉽다는 것을 지적하고 있었으며, 런타임에서도 반드시 수행하지 않아도되는 비슷한 방식이있을 수 있기를 기대했습니다. 프로그래머를 위해 일하십시오. 하지만 그래, 그 유틸리티를 사용하는 것은 갈 길인 것 같다. – tacospice

0

당신은 이것을 보았습니다. 나는 그것을 사용했고 조금 복잡하지만 많은 것들을 자동화합니다.

1

작성하려는 구문은 Luabind을 사용하여 Lua로 C++ 함수를 내보내는 경우 쓰는 구문과 비슷합니다.

저는 Lua를 C++와 통합하기 위해 Lua C API를 직접 사용 했었지만 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) 
]; 

이 사방에 등록을 배포 할 수있는만큼 멋진 것이 아니라 내가 찾아 쉽게 직접 루아 C API를 사용하는 것보다 더 구문 가까이.