簡體   English   中英

C ++ 11 std :: function:綁定沒有特定實例的方法

[英]C++11 std::function: Binding a method without a particular instance

繼續這個主題,我想把它分成另一個更具體的問題。 我想使用ChaiScript綁定一個函數,我可以使用std::function來做到這一點,但我似乎無法讓std::function知道它應該使用哪個重載。

鏡像相關方法:

class DLLExport Actor
{
public:
        Actor(Level* level, const String& name, Actor* parent);
        virtual ~Actor();

        void setPosition(const Real& x, const Real& y, const Real& z);
        void setPosition(const Vector3& position);
};

然后我試圖像這樣綁定它:

std::function<void(Actor*, Vector3&)> setPos = &Actor::setPosition; // <-- C2440 here.
m->add(fun(setPos), "setPosition");

我得到的是以下錯誤:

2>..\\..\\ScriptingDemo\\Binder.cpp(63): error C2440: 'initializing' : cannot convert from 'overloaded-function' to 'std::function<void (Actor *, Vector3 &)>' 2> No constructor could take the source type, or constructor overload resolution was ambiguous

對你的成員函數使用typedef

typedef void (Actor::*set_type)(const Vector3&); // Note the syntax for a member function typedef

並使用它來干凈的static_cast來解決重載:

std::function<void(Actor&, const Vector3&)> setPos = static_cast<Actor::set_type>(&Actor::setPosition);

(注意成員函數的隱式Actor&參數,在上面的std::function<>簽名中顯式)

C ++重載方法指針

基本上,手動投入。

std::function<void(Actor*, const Vector3&)> setPos((void(Actor::*)(const Vector3&))&Actor::setPosition);

現在為什么:

std :: function的=運算符(本身)是一個模板,不為其參數提供類型信息。 因此,當您嘗試將其分配給&Actor :: setPosition時,編譯器沒有好的方法來確定您要求的功能。 投入修復即可。

Actor *參數來自函數Actor :: *的類型,而不是函數簽名本身。

您正在嘗試將成員函數指針轉換為自由函數指針,但這不起作用。 如果可能的話,你無論如何都忘記了std::function模板參數中的const

您加入Actor*是正確的:

#include <iostream>
#include <functional>

struct Foo {
    void bar(int const &i) { std::cout << i; }
};

int main()
{
    using namespace std::placeholders;
    std::function<void(Foo*, int const&)> func = std::bind(&Foo::bar, _1, _2);

    Foo foo;
    func(&foo, 17);

    return 0;
}

請注意,您仍然需要提供一個實例來一次調用該方法,但您會期望什么?

暫無
暫無

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

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