Переменные аргументы в лямбде как указатель на функцию

Я хочу скопировать функцию из одного Lua_State в другой, используя luabridge.

Luabridge предоставляет функцию под названием addFunction(const char * name,FP fp) и функция называется getGlobal(lua_State* L,const char*) который возвращает объект типа LuaRef который перегружен операторами. Я использую мультикарту для хранения имен функций, которые я хочу скопировать.

функция addFunction() не поддерживает использование указателя на класс, поэтому я не могу передать getGlobal().operator() непосредственно

    //get all functions that match the Criteria
    std::pair<acc_map_iter, acc_map_iter> range = sec_map->equal_range(acl);

    //Add them to the first State
    std::for_each(range.first, range.second, [&](acc_map_iter iter){
        script->compilerContext->addFunction(iter->second.c_str(), [&](/*args...?*/)
        {
            return luabridge::getGlobal(sec_state, iter->second.c_str()).operator(/*args...?*/);
        });
    });

Можно ли как-нибудь заставить лямбду принимать несколько аргументов из addFunction(), Есть ли хитрость или это просто невозможно?

1 ответ

Я не уверен, что у меня проблема, но кажется, что вам нужна общая лямбда.
Да, вы можете иметь их. Вот минимальный рабочий пример:

#include<utility>

struct S {
    void g(int) { }

    template<typename... Args>
    void f(Args&&... args) {
        auto fn = [this](auto&&... args){
            g(std::forward<decltype(args)>(args)...);
        };
        fn(std::forward<Args>(args)...);
    }
};

int main() {
    S s;
    s.f(42);
}

Это вопрос уродливого утверждения, подобного тому, которое касается decltype выдвинуть аргументы.

Другие вопросы по тегам