어느분이 필요하시다고 하여서 이곳에 간단히 글을 올리겠습니다.
^^; 저도 메타프로그래밍 같은걸 좋아하지도 잘 하지도 않지만 그냥 조금 수정해서 적당히? 붙여 쓰고 있었습니다.
C++빌더에 잘 붙지 않는 가장 큰 이유는... 결국 illegal 한 문법 사용 때문입니다.
(참고로.. 테스트한 버전은 C++빌더 2009입니다.)
뭐 해석의 차이겠지만... 어쨋든 깐깐한 빌더가 저 처럼 표준에 무관심한;; 사람을 밝혀주니 좋긴 합니다만...
가끔 바로갈 길을 돌아가고 싶은 경우가 있듯... 좀 갑갑하기도 합니다.
시간 되시는 분은 좀 돌아가는 길(수정;;)을 알려주셔도 좋고... 흠.. 암튼;;
LuaTinker0.5b를 받으셔서 헤더파일 조금과 컴파일 옵션을 조금 수정 하시면 됩니다.
대부분 명시적이지 않거나 예외상황과 관련된 것입니다. --;;
첫번째 수정 (lua_tinker.h)
//------------------------------------------------------------------------------
// read a value from lua stack
template< typename T >
T read(lua_State *L, int index) { return lua2type< T >(L, index); }
template<> char* read< char* >(lua_State *L, int index);
template<> const char* read< const char* >(lua_State *L, int index);
template<> char read< char >(lua_State *L, int index);
template<> unsigned char read< unsigned char >(lua_State *L, int index);
template<> short read< short >(lua_State *L, int index);
template<> unsigned short read< unsigned short >(lua_State *L, int index);
template<> long read< long >(lua_State *L, int index);
template<> unsigned long read< unsigned long >(lua_State *L, int index);
template<> int read< int >(lua_State *L, int index);
template<> unsigned int read< unsigned int >(lua_State *L, int index);
template<> float read< float >(lua_State *L, int index);
template<> double read< double >(lua_State *L, int index);
template<> bool read< bool >(lua_State *L, int index);
template<> void read< void >(lua_State *L, int index);
template<> __int64 read< __int64 >(lua_State *L, int index);
template<> unsigned __int64 read< unsigned __int64 >(lua_State *L, int index);
template<> table1 read< table1 >(lua_State *L, int index);
//------------------------------------------------------------------------------
템플릿 read 함수가 정의되어 있는데 특화(specilize) 버전을 명시적으로 구분해 주어야합니다.
기존 코드는 함수명 옆에 read< char* > 처럼 명시하지 않고 그냥 read만 적혀있네요.
암튼.. 깐깐한 빌더는 이걸 지적하고 옆에서 삐져서 흥! 흥! 거리고 있네요. --;
두번째 수정(lua_tinker.h)
//------------------------------------------------------------------------------
// functor
template< typename T1=void, typename T2=void, typename T3=void, typename T4=void, typename T5=void >
struct functor
{
template< typename RVal >
static int invoke(lua_State *L) { push(L,upvalue_< RVal(*)(T1,T2,T3,T4,T5) >(L)(read< T1 >(L,1),read< T2 >(L,2),read< T3 >(L,3),read< T4 >(L,4),read< T5 >(L,5))); return 1; }
// template<>
// static int invoke< void >(lua_State *L) { upvalue_< void(*)(T1,T2,T3,T4,T5) >(L)(read< T1 >(L,1),read< T2 >(L,2),read< T3 >(L,3),read< T4 >(L,4),read< T5 >(L,5)); return 0; }
};
//------------------------------------------------------------------------------
역시 스페셜라이즈 부분입니다.
그런데 여기서는 그냥 삐지는 수준이 아니라 선을 긋고는 움직이질 않네요.. -_-;
코드를 보시면 아시겠지만... 주석으로 막았습니다. -_ -;;
주석을 하는 순간 루아팅커의 어떤? 기능이 막히는 것인데... 한마디로 void 리턴 C/C++ 함수/멤버를 루아와 연결 할 수 없습니다. ㅠ.ㅠ...
(제네릭 코드 내에서의 스페셜라이즈는 불법! 이라면서... ㅠ.ㅠ... 이래서 정도는 어려운길... 정도가 맞는건지 --;;)
이런 오류로 주욱 비슷한 구문이 있으니 모두 수정하면 10개 쯤 될것입니다.
세번째 수정(C++ 컴파일 옵션 수정)
Project -> Option -> C++ Compiler -> Compatibility -> Explicit template specialization as member function = TRUE
이 옵션을 켜주면 됩니다.
역시나 멤버 함수로의 스페셜라이즈를 막은 것인데... 이건 옵션으로 제공하네요.
이 옵션을 보니 조만간 위에서 수정되고 주석으로 막은(ㅠ.ㅠ) 부분도 옵션에 추가될 듯 합니다.
루아팅커 Sample3, 5번을 보면 void 리턴 함수는 적당히 int리턴으로 바꾸고 return 0; 같은 더미? 코드를 넣으면
잘 동작합니다.
루아는 잘 컴파일 되니 문제 없을듯 하고... 루아팅커는 혹시 몰라서 첨부합니다.
예제를 포함하는 main.cpp와 연관된 sample1~5.lua 파일도 있습니다.
메타 프로그래밍에 관심을 가지고 싶은 분이라면... 이런 순으로 보세요. (시간 잘? 지나갑니다. --;;)
1. C++ 템플릿 메타 프로그래밍
2. Modern C++ Design
흠;; 다른 책도 있네요. ^^; (서점에 놀러 가봐야겠습니다. ~_~;;) <-- 이 책이 보는데 더 좋네요. ^^;
http://kangcom.com/sub/view.asp?sku=200812020004
루아팅커
http://gpgstudy.com/gpgiki/LuaTinker
GPGStudy 루아 관련
http://gpgstudy.com/gpgiki/TitleSearch?auto_redirect=1&s=Lua
망치 님이 쓰신 글 :
: 저번에 자유게시판에 스크립트는 주로 무엇을 쓰시나요라는 누군가의 질문에 대한 대답을 보면서
: lua를 처음 알게되었습니다.
: 그래서 이틀전에 드디어 lua.org에 들어가서 5.14버젼 소스 다운받아서, 빌더 2007에 컴파일해서 lib파일 만들고,
: 검색 쭈욱 해보니 C나 C++에서 lua를 호출하는 예제가 있더군요. 그대로 따라하니 에러가 나서 조금 수정하니,
: lua파일 읽어서 함수를 실행하고, lua에 있는 변수값을 읽어오더군요.
:
: 스크립트 처음 써본 저에게는 프로그램 제 영역에 m&a해서 다른 멋진 회사를 인수한것처럼 기쁘더군요.
:
: lua를 래핑한 뭐 여러가지 라이브러리나 오픈소스들이 즐비하지만 일단 lua가 가지고 있는 소스양이 얼마
: 크지않고 복잡하지 않아 lua소스를 직접 돌려본겁니다.
:
: 아직 lua를 제대로 활용하기에는 앞길이 험난하겠지만 그래도 lua라는 것을 알게 되었고 되는걸 눈으로 직접 봤다는것이 기쁩니다.
:
: 하여튼 포럼을 통해서 한수 배워갑니다.
복 받으실거예요..