Доступ к отдельным типам вариационных шаблонов
Я создаю привязку lua в C++11. Я хочу обработать каждый тип в вариационном шаблоне.
Я думал, что могу сделать что-то подобное, кроме как с помощью Params...
представляет все типы внутри него, а не следующий отдельный тип внутри него, как это делают параметры функции variadic.
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
}
}
};
Как бы я поступил так?
1 ответ
Решение
Вы можете сделать это, просто расширив после вызова функции, до чего-то, что может быть расширено до.
// 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)...
};
}