2012-11-18 2 views
1

C++ 11에서 lua 바인딩을 생성합니다. 난 variadic 템플릿에서 각 유형을 처리하고 싶습니다.Variadic 템플릿의 개별 유형 액세스

Params...을 사용하는 것을 제외하고 나는 이것과 비슷한 것을 할 수 있다고 생각 했었습니다. 가변 내부 함수 매개 변수처럼 내부의 모든 단일 유형을 나타냅니다.

template <class T, typename ReturnType, typename... Params> 
struct MemberFunctionWrapper <ReturnType (T::*) (Params...)> 
{ 

    static int CFunctionWrapper (lua_State* luaState) 
    { 
     for(int i = 0; i < sizeof...(Params); i++) 
     { 
      //I want to get the next type, not all of the types 
      CheckLuaValue<Params...>(); 
      //Do other stuff 
     } 
    } 
}; 

어떻게하면됩니까?

+0

huh? . . . . . . –

답변

6

이 작업은 함수 호출 후에 확장 할 수있는 것으로 확장 할 수 있습니다.

// put this in your namespace 
struct Lunch { template<typename ...T> Lunch(T...) {} }; 

// and this instead of the for loop 
Lunch{ (CheckLuaValue<Params>(), void(), 0)... }; 

람다를 사용하여 다른 작업을 수행 할 수 있습니다. 당신은 표준이 람다에 최선을 다하는하여 지원하는 당신의 i 증가

static int CFunctionWrapper (lua_State* luaState) 
{ 
    int i = 0; 
    Lunch{ 
     (CheckLuaValue<Params>(), 
     [&]{ std::cout << "That was param " << i << std::endl; }(), 
     ++i)... 
    }; 
} 

주를 가질 수 있습니다. 최근까지 (내가 마지막으로 체크했을 때까지) 컴파일러 지원은 좋지 않았다.

static int CFunctionWrapper (lua_State* luaState) 
{ 
    int i = 0; 
    Lunch{([&]{ 
     CheckLuaValue<Params>(); 
     std::cout << "That was param " << i << std::endl; 
    }(), ++i)... 
    }; 
} 
+0

함수 인수 평가에서 지정된 순서가 없기 때문에이 UB가 아닌가요? 나는 대신 (임시) 배열을 사용할 것이다 :'alias {(..., ++ i) ...}'. – Xeo

+1

@Xeo UB가 아닙니다 :'{...} '을 사용할 때 함수 호출이 발생하더라도 순서가 정의됩니다. 'Params'가 비어있을 때 (제안 된 크기가 0 인 배열) 제안서가 실패합니다. –

+0

아, 잘 알고 있습니다. 그리고 확장 전에 더미 '0'을 가짐으로써 제로 - 케이스를 쉽게 고칠 수 있습니다. – Xeo