簡體   English   中英

腳本和從std :: bind到std :: function的轉換

[英]Emscripten and conversion from std::bind to std::function

我正在嘗試使用emscripten編譯我的項目。 本機在Visual Studio 2013中,一切正常。

我在其中存儲函數:

template<typename Return, typename ...Arguments>
using CBFunction = std::function<Return(Arguments...)>;

typedef unsigned int CBID;

template<typename Return, typename ...Arguments>
class CBCollection
{
    std::map<CBID, CBFunction<Return, Arguments...>> cbs;
public:
    CBID addCB(CBFunction<Return, Arguments...> cb)
    {
        CBID id = findFreeID();
        cbs[id] = cb;
        return id;
    }

    ...
}

稍后,我可以添加簡單的成員函數:

CBCollection<void, MatrixStack, float> BeforeRenderCBs;
...
AnimatedSprite::AnimatedSprite()
{
    using namespace placeholders;
    BeforeRenderCBs.addCB(bind(&AnimatedSprite::beforeRenderCB, this, _1, _2));
}

使用emscripten,結果如下:

<scratch space>:624:1: note: expanded from here
"C:/Development/LexUnitEngine/Engine/include/Buffer.h"
^
C:\Development\LexUnitEngine\Engine\source\AnimatedSprite.cpp:76:24: error: no viable conversion from '__bind<void (AnimatedSprite::*)(MatrixStack &, float), AnimatedSprite *, std::__1::placeholders::__ph<1> &, std::__1::placeholders::__ph<2> &>' to 'CBFunction<void, MatrixStack, float>'
      (aka 'std::__1::function<void (MatrixStack, float)>')
        BeforeRenderCBs.addCB(bind(&AnimatedSprite::beforeRenderCB, this, _1, _2));
                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\PROGRA~1\EMSCRI~1\EMSCRI~1\129~1.0\system\include\libcxx\functional:1448:5: note: candidate constructor not viable: no known conversion from '__bind<void (AnimatedSprite::*)(MatrixStack &, float), AnimatedSprite *, std::__1::placeholders::__ph<1> &, std::__1::placeholders::__ph<2> &>' to
      'nullptr_t' for 1st argument
    function(nullptr_t) _NOEXCEPT : __f_(0) {}
    ^
C:\PROGRA~1\EMSCRI~1\EMSCRI~1\129~1.0\system\include\libcxx\functional:1449:5: note: candidate constructor not viable: no known conversion from '__bind<void (AnimatedSprite::*)(MatrixStack &, float), AnimatedSprite *, std::__1::placeholders::__ph<1> &, std::__1::placeholders::__ph<2> &>' to
      'const std::__1::function<void (MatrixStack, float)> &' for 1st argument
    function(const function&);
    ^
C:\PROGRA~1\EMSCRI~1\EMSCRI~1\129~1.0\system\include\libcxx\functional:1450:5: note: candidate constructor not viable: no known conversion from '__bind<void (AnimatedSprite::*)(MatrixStack &, float), AnimatedSprite *, std::__1::placeholders::__ph<1> &, std::__1::placeholders::__ph<2> &>' to
      'std::__1::function<void (MatrixStack, float)> &&' for 1st argument
    function(function&&) _NOEXCEPT;
    ^
C:\PROGRA~1\EMSCRI~1\EMSCRI~1\129~1.0\system\include\libcxx\functional:1454:41: note: candidate template ignored: disabled by 'enable_if' [with _Fp = std::__1::__bind<void (AnimatedSprite::*)(MatrixStack &, float), AnimatedSprite *, std::__1::placeholders::__ph<1> &, std::__1::placeholders::__ph<2>
      &>]
                                        __callable<_Fp>::value &&
                                        ^
C:/Development/LexUnitEngine/Engine/include/CallbackCollection.h:49:46: note: passing argument to parameter 'cb' here
        CBID addCB(CBFunction<Return, Arguments...> cb)
                                                    ^

我試圖將CBFunction切換到

std::function<Return(Arguments...)

到處都是,但它不能解決問題,我需要在其他地方使用CBFunction。

emscripten版本是1.29.0,clang 3.4

您的類型不匹配。 如果查看編譯錯誤,則AnimatedSprite::beforeRenderCB的類型為:

void (AnimatedSprite::*)(MatrixStack &, float)

但是您正在嘗試將其轉換為帶有簽名的std::function

void(MatrixStack, float)

如果您將集合類型更改為:

CBCollection<void, MatrixStack&, float> BeforeRenderCBs;
//                            ^

它應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM