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

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

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

C++
慕田峪9158850 2019-08-03 12:03:15
使用泛型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 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

必须使用对象调用非静态成员函数.也就是说,它总是隐式地传递“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-08-04
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

要么你需要

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

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

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


查看完整回答
反对 回复 2019-08-04
?
烙印99

TA贡献1829条经验 获得超13个赞

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

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-08-04
  • 3 回答
  • 0 关注
  • 351 浏览

添加回答

举报

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