【问题标题】:How do I create a binding (Emscripten) for a function that accepts a `std::function &&`?如何为接受`std::function &&`的函数创建绑定(Emscripten)?
【发布时间】:2021-11-17 00:18:53
【问题描述】:

我有一个将std::function 作为参数的函数:

class Foo {
    virtual void bar(std::function<void()> &&func) = 0;
};

我想创建一个实现 Foo 的 JS 包装器。

struct FooWrapper : public wrapper<Foo> {
    EMSCRIPTEN_WRAPPER(FooWrapper);

    void bar(std::function<void()> &&func) override {
        call<void>("bar", std::move(func));
    }
};

EMSCRIPTEN_BINDINGS(Foo) {
        class_<Foo>("Foo")
                .smart_ptr<Foo>("Foo")
                .allow_subclass<FooWrapper, std::shared_ptr<FooWrapper>>("FooWraper", "FooWraperSharedPtr");
}

但是,当我尝试从 JavaScript (TypeScript) 调用 bar 时,我得到一个 BindingError

const foo = // Create Foo object
foo.bar(() => {
    // Do something
})

BindingError: parameter 1 has unknown type NSt3__28functionIFvvEEE

有人知道如何绑定 std::function 以便我可以将 JavaScript lambda 函数传递给它吗?

【问题讨论】:

  • 你不能这样做。根据它检查网页emscripten.org/docs/porting/connecting_cpp_and_javascript/…,如果您声明一个C++接口类并在Java Script中实现它,则可以从C++调用JavaScript代码,然后在接口是可接受的输入的调用中使用它。但是您不能在 Java Script 中表示 std::function,因为它不是接口。
  • 我希望 Emscripten 将 JavaScript lambda 转换为 std::function。显然,事实并非如此。
  • 不可能以这种方式工作。 std::function 是包含在标准库中的模板类。这不是语言功能。

标签: javascript c++ emscripten embind


【解决方案1】:

这实际上是可能的。

EMSCRIPTEN_BINDINGS(FUNCTION_VOID) {
            class_<std::function<void()>>("Function_Void")
                    .constructor()
                    .function("opCall", &std::function<void()>::operator());
    }

然后,JavaScript 可以通过简单地调用 opCall() 来执行 std::function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-22
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    相关资源
    最近更新 更多