为了账号安全,请及时绑定邮箱和手机立即绑定

使用泛型STD:在一个类中具有成员函数的函数对象

使用泛型STD:在一个类中具有成员函数的函数对象

C++ C
蝴蝶不菲 2019-07-11 16:39:29
使用泛型STD:在一个类中具有成员函数的函数对象对于一个类,我想在一个类中存储一些指向同一个类的成员函数的函数指针。map贮存std::function物品。但我在一开始就失败了,这段代码是:class Foo {     public:         void doSomething() {}         void bindFunction() {             // ERROR             std::function<void(void)> f = &Foo::doSomething;         }};我收到error C2064: term does not evaluate to a function taking 0 arguments在……里面xxcallobj结合一些奇怪的模板实例化错误。目前,我在Windows 8上使用VisualStudio 2010/2011,在Win 7上使用VS 10,它也失败了。错误必须基于一些我不遵循的奇怪的C+规则。编辑:我知道不用助推。这是集成在MS编译器中的C+11。
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

必须使用对象调用非静态成员函数.也就是说,它总是隐式地传递“this”指针作为它的参数。

因为你std::function签名指定您的函数不带任何参数(<void(void)>),你必须绑定第一个(也是唯一的)论点。

std::function<void(void)> f = std::bind(&Foo::doSomething, this);

如果要用参数绑定函数,则需要指定占位符:

using namespace std::placeholders;std::function<void(int,int)> f = std::bind(&Foo::doSomethingArgs, this, _1, _2);

或者,如果编译器支持C+11 lambdas:

std::function<void(int,int)> f = [=](int a, int b) {
    this->doSomethingArgs(a, b);}

(我手头没有C+11能力的编译器现在就来所以我不能检查这个。)


查看完整回答
反对 回复 2019-07-11
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

要么你需要

std::function<void(Foo*)> f = &Foo::doSomething;

这样就可以在任何实例上调用它,或者需要绑定特定的实例,例如this

std::function<void(void)> f = std::bind(&Foo::doSomething, this);


查看完整回答
反对 回复 2019-07-11
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

如果需要存储成员函数类实例,您可以这样做:

class MyClass{public:
    void MemberFunc(int value)
    {
      //do something
    }};// Store member function bindingauto callable = std::mem_fn(&MyClass::MemberFunc);
    // Call with late supplied 'this'MyClass myInst;callable(&myInst, 123);

如果没有,存储类型会是什么样子?汽车?就像这样:

std::_Mem_fn_wrap<void,void (__cdecl TestA::*)(int),TestA,int> callable

还可以将此函数存储传递给标准函数绑定。

std::function<void(int)> binding = std::bind(callable, &testA, std::placeholders::_1);binding(123); // Call

过去和未来的注释:一个旧的界面STD:Mem_func已经存在了,但后来被废弃了。有一个建议,C+17,可以提出指向可调用成员函数的指针..这将是最受欢迎的。


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 564 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信