For one class I want to store some function pointers to member functions of the same class in one map
storing std::function
objects. But I fail right at the beginning with this code:
class Foo {
public:
void doSomething() {}
void bindFunction() {
// ERROR
std::function<void(void)> f = &Foo::doSomething;
}
};
I receive error C2064: term does not evaluate to a function taking 0 arguments
in xxcallobj
combined with some weird template instantiation errors. Currently I am working on Windows 8 with Visual Studio 2010/2011 and on Win 7 with VS10 it fails too. The error must be based on some weird C++ rules i do not follow.
EDIT: I do NOT use boost. This is C++11 integrated in the MS compiler.
If you need to store a member function without the class instance, you can do something like this:
What would the storage type look like without auto? Something like this:
You can also pass this function storage to a standard function binding
Past and future notes: An older interface std::mem_func existed, but has since been deprecated. A proposal exists, post C++17, to make pointer to member functions callable. This would be most welcome.
A non-static member function must be called with an object. That is, it always implicitly passes "this" pointer as its argument.
Because your
std::function
signature specifies that your function doesn't take any arguments (<void(void)>
), you must bind the first (and the only) argument.If you want to bind a function with parameters, you need to specify placeholders:
Or, if your compiler supports C++11 lambdas:
(I don't have a C++11 capable compiler at hand right now, so I can't check this one.)
Either you need
so that you can call it on any instance, or you need to bind a specific instance, for example
this