【问题标题】:variable arguments in lambda as function pointerlambda中的可变参数作为函数指针
【发布时间】:2016-09-19 05:39:26
【问题描述】:

我想使用 luabridge 将一个函数从一个 Lua_State 复制到另一个。

luabridge 提供了一个名为addFunction(const char * name,FP fp) 的函数和一个名为getGlobal(lua_State* L,const char*) 的函数,它返回一个具有重载运算符的LuaRef 类型的对象。我正在使用 multimap 来存储要复制的函数的名称。

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

我能否以某种方式使 lambda 接受来自addFunction() 的多个参数。有什么诀窍还是根本不可能?

【问题讨论】:

  • 您的问题有点难以理解,但也许您可以使用std::bind()
  • 对不起,我想这是一个很奇怪的问题。将绑定支持传递可变数量的参数?

标签: c++ lambda arguments luabridge


【解决方案1】:

我不确定我是否遇到了问题,但您似乎需要一个通用 lambda。
是的,你可以拥有它们。这是一个最小的工作示例:

#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 转发参数的声明一样。

【讨论】:

  • 我认为这在我的情况下不起作用,因为无法使用 f() 推断出参数的类型,因为 f() 实际上不会调用函数来做某事
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 2021-11-29
  • 2011-02-04
相关资源
最近更新 更多