[英]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<>
簽名中顯式)
基本上,手動投入。
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.