C++ C++;11 std::function:绑定没有特定实例的方法

C++ C++;11 std::function:绑定没有特定实例的方法,c++,c++11,std-function,chaiscript,C++,C++11,Std Function,Chaiscript,继续,我想把它分成另一个更具体的问题。我想用ChaiScript绑定一个函数,我可以用std::function绑定,但我似乎不能让std::function知道它应该使用哪个重载 镜像相关方法: class DLLExport Actor { public: Actor(Level* level, const String& name, Actor* parent); virtual ~Actor(); void setPosition

继续,我想把它分成另一个更具体的问题。我想用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");
std::function setPos=&Actor::setPosition;//添加(乐趣(设置位置),“设置位置”);
我得到的是以下错误:

2>。\..\ScriptingDemo\Binder.cpp(63):错误C2440:“初始化”:无法从“重载函数”转换为“std::函数”
2> 没有构造函数可以采用源类型,或者构造函数重载解析不明确

基本上,手动放入铸件

std::function<void(Actor*, const Vector3&)> setPos((void(Actor::*)(const Vector3&))&Actor::setPosition);
std::function setPos((void(Actor::*)(const Vector3&)和Actor::setPosition);
现在是为什么:

std::函数的=运算符(本身)是一个模板,不为其参数提供类型信息。因此,当您尝试将其分配给&Actor::setPosition时,编译器没有好的方法来确定您要的是哪个函数。加入演员阵容可以解决这个问题


Actor*参数来自函数Actor::*的类型,而不是函数签名本身。

您试图将成员函数指针转换为自由函数指针,但这无法工作。如果可能,您还是忘记了
std::function
模板参数中的
const

您加入的
演员*
是正确的:

#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;
}
#包括
#包括
结构Foo{

void bar(int const&i){std::cout对成员函数使用
typedef

typedef void (Actor::*set_type)(const Vector3&); // Note the syntax for a member function typedef
并将其用于干净的
静态播放
,以解决过载问题:

std::function<void(Actor&, const Vector3&)> setPos = static_cast<Actor::set_type>(&Actor::setPosition);
std::function setPos=static_cast(&Actor::setPosition);
(注意成员函数的隐式
Actor&
参数,在上述
std::function
签名中显式)

这归结为