【问题标题】:BindingError: Passing raw pointer to smart pointer is illegalBindingError:将原始指针传递给智能指针是非法的
【发布时间】:2021-12-03 04:00:38
【问题描述】:

考虑以下 C++ 代码和相应的 Emscripten 绑定。

class IBar {
    void qux() = 0;
};

struct BarWrapper : public wrapper<IBar> {
    void qux() override {
        return call<>("qux");
    }
}

EMSCRIPTEN_BINDINGS(IBar) {
    class_<IBar>("IBar")
        .smart_ptr<std::shared_ptr<IBar>>("IBar")
        .function("qux", &IBar::qux)
        .allow_subclass<BarWrapper>("BarWrapper");;
}

class Foo {
    std::shared_ptr<IBar> getBar() const;
    void setBar(std::shared_ptr<IBar> bar);
};

EMSCRIPTEN_BINDINGS(Foo) {
    class_<Options>("Foo")
        .constructor<>()
        .property("bar", &Foo::getBar, &Foo::setBar);
}

在 TypeScript 中,我有以下内容:

class Bar {
    qux() {

    }
}

const bar = new Module.Bar.implement(new Bar())

这里的问题是Foo::setBar 采用std::shared_ptrModule.Bar.implement 返回一个原始指针。这使我无法将bar 传递给Foo::setBar

有人知道如何在这里将原始指针转换为共享指针吗?或者,有人知道一个好的解决方法吗?

【问题讨论】:

  • 只需添加一个void setBar(IBar* bar); 重载?
  • 是的,我考虑过。然后我可以从原始指针创建一个shared_ptr。我希望有别的东西,也许是 Emscripten 内置的我还不知道的东西。
  • 理想情况下,Emscripten 将支持 new Module.Bar.implement 返回智能指针。

标签: c++ shared-ptr webassembly emscripten embind


【解决方案1】:

虽然 OP 在 cmets 中确实提到他们宁愿不走那条路,但为了完整起见:

setBar() 添加一个采用原始指针的重载/替代方案:

class Foo {
    std::shared_ptr<IBar> getBar() const;
    void setBar(std::shared_ptr<IBar> bar);
    void setBarTakingOwnership(IBar* b) { setBar(std::shared_ptr<IBar>(b)); }
};

并在绑定时使用它:

EMSCRIPTEN_BINDINGS(Foo) {
    class_<Options>("Foo")
        .constructor<>()
        .property("bar", &Foo::getBar, &Foo::setBarTakingOwnership);
}

应该做的伎俩。

NB 正如 cmets 中提到的,获取原始指针的所有权始终是如履薄冰的领域,因此如果您必须获取原始指针的所有权,最好在方法名。

【讨论】:

    【解决方案2】:

    我想出了一个不返回添加接受原始指针的方法的解决方案。

    它通过扩展IBar 的绑定来工作。

    EMSCRIPTEN_BINDINGS(IBar) {
        class_<IBar>("IBar")
            .smart_ptr<std::shared_ptr<IBar>>("IBar")
            .function("qux", &IBar::qux)
            .allow_subclass<BarWrapper, std::shared_ptr<BarWrapper>>("BarWrapper", "BarWrapperSharedPtr");;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多