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

使用泛型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。



慕田峪9158850
浏览 352回答 3
3回答

holdtom

必须使用对象调用非静态成员函数.也就是说,它总是隐式地传递“this”指针作为它的参数。因为你std::function签名指定您的函数不带任何参数(<void(void)>),你必须绑定第一个(也是唯一的)论点。std::function<void(void)>&nbsp;f&nbsp;=&nbsp;std::bind(&Foo::doSomething,&nbsp;this);如果要用参数绑定函数,则需要指定占位符:using&nbsp;namespace&nbsp;std::placeholders;std::function<void(int,int)>&nbsp;f&nbsp;=&nbsp;std::bind(&Foo::doSomethingArgs,&nbsp;this,&nbsp;_1,&nbsp;_2);或者,如果编译器支持C+11 lambdas:std::function<void(int,int)>&nbsp;f&nbsp;=&nbsp;[=](int&nbsp;a,&nbsp;int&nbsp;b)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;this->doSomethingArgs(a,&nbsp;b);}(我手头没有C+11能力的编译器现在就来所以我不能检查这个。)

繁星点点滴滴

要么你需要std::function<void(Foo*)>&nbsp;f&nbsp;=&nbsp;&Foo::doSomething;这样就可以在任何实例上调用它,或者需要绑定特定的实例,例如thisstd::function<void(void)>&nbsp;f&nbsp;=&nbsp;std::bind(&Foo::doSomething,&nbsp;this);

烙印99

如果需要存储成员函数无类实例,您可以这样做:class&nbsp;MyClass{public: &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;MemberFunc(int&nbsp;value) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//do&nbsp;something &nbsp;&nbsp;&nbsp;&nbsp;}};//&nbsp;Store&nbsp;member&nbsp;function&nbsp;bindingauto&nbsp;callable&nbsp;=&nbsp;std::mem_fn(&MyClass::MemberFunc); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Call&nbsp;with&nbsp;late&nbsp;supplied&nbsp;'this'MyClass&nbsp;myInst;callable(&myInst,&nbsp;123);如果没有,存储类型会是什么样子?汽车?就像这样:std::_Mem_fn_wrap<void,void&nbsp;(__cdecl&nbsp;TestA::*)(int),TestA,int>&nbsp;callable还可以将此函数存储传递给标准函数绑定。std::function<void(int)>&nbsp;binding&nbsp;=&nbsp;std::bind(callable,&nbsp;&testA,&nbsp;std::placeholders::_1);binding(123);&nbsp;//&nbsp;Call过去和未来的注释:一个旧的界面STD:Mem_func已经存在了,但后来被废弃了。有一个建议,C+17,可以提出指向可调用成员函数的指针..这将是最受欢迎的。
打开App,查看更多内容
随时随地看视频慕课网APP