继续this thread我想将其拆分为另一个更具体的问题。我想使用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
答案 0 :(得分:2)
对您的会员功能使用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<>
签名中明确指出)
答案 1 :(得分:1)
基本上,手动输入演员。
std::function<void(Actor*, const Vector3&)> setPos((void(Actor::*)(const Vector3&))&Actor::setPosition);
现在为什么:
std :: function的=运算符(本身)是一个模板,不为其参数提供类型信息。因此,当您尝试将其分配给&amp; Actor :: setPosition时,编译器无法确定您要求的功能。投入修复了那个。
Actor *参数来自函数Actor :: *的类型,而不是函数签名本身。
答案 2 :(得分:0)
您正在尝试将成员函数指针转换为自由函数指针,但这不起作用。如果可能,您忘记了const
模板参数中的std::function
。
您加入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;
}
请注意,您仍然需要提供一个实例来一次调用该方法,但您会期望什么?