2016-05-22 4 views
2

Ich möchte eine Funktion von einem Lua_State zu einem anderen mit Luabridge kopieren.Variable Argumente in Lambda als Funktionszeiger

luabridge bietet eine Funktion namens addFunction(const char * name,FP fp) und eine Funktion namens getGlobal(lua_State* L,const char*), die ein Objekt vom Typ LuaRef zurückgibt, das Operatoren überladen hat. Ich verwende eine Multimap, um die Namen der Funktionen zu speichern, die ich kopieren möchte.

die Funktion addFunction() nicht die Verwendung eines Zeiger auf eine Klasse unterstützen, damit ich nicht getGlobal().operator() direkt

//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...?*/); 
     }); 
    }); 

Kann ich irgendwie das Lambda mehr Argumente von addFunction() akzeptieren passieren kann. Gibt es einen Trick oder ist es einfach unmöglich?

+0

Ihre Frage ist ein bisschen schwer zu folgen, aber vielleicht können Sie 'std :: bind()'? –

+0

Tut mir leid, ich denke, das ist eine ziemlich merkwürdige Frage. würde Unterstützung binden, um eine variable Anzahl von Argumenten zu durchlaufen? – Raphl10

Antwort

0

Ich bin mir nicht sicher, ob ich das Problem habe, aber es scheint, dass Sie ein generisches Lambda brauchen.
Ja, Sie können sie haben. Hier ist ein minimal, funktionierendes Beispiel:

#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); 
} 

Es ist eine Frage von einer hässlichen Aussage wie die die decltype unter Einbeziehung der Argumente zu übermitteln.

+0

Ich glaube nicht, dass dies in meinem Fall funktionieren würde, da die Typen des Arguments nicht mit f() abgeleitet werden können, weil f() die Funktion nicht dazu aufruft, etwas zu tun – Raphl10