Доступ к отдельным типам вариационных шаблонов

Я создаю привязку 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)... 
    };
}
Другие вопросы по тегам