1

继续这个话题,我想把它分成另一个更具体的问题。我想使用 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

4

3 回答 3

2

typedef对您的成员函数使用 a :

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<>签名中显式)

于 2014-08-25T16:24:08.590 回答
1

C++ 重载方法指针

基本上,手动放入演员表。

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

现在为什么:

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

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

于 2014-08-25T16:17:31.063 回答
0

您正在尝试将成员函数指针转换为自由函数指针,但这是行不通的。如果可能的话,无论如何您都忘记了const模板std::function参数中的 。

不过,您包含的 anActor*是正确的:

#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;
}

请注意,您仍然需要提供一个实例来在某一时刻调用该方法,但是您期望什么?

于 2014-08-25T16:21:46.567 回答