Re: currying pointer to member functions
On 2013-03-06 00:20, Jerry wrote:
I appreciate any advice about how to do this.
I can make this work:
struct a
{
int b;
int c() {return b+1;}
int d(int x) {return b+x;}
};
int main()
{
a m = { 1 }, n = { 2 };
a *ps = &m;
int (a::*pf)() = &a::c;
std::cout << (ps->*pf)() << std::endl;
return 0;
}
And it runs the function and everything works. But what I want to
do is curry the function so that I can store (ps->*pf) and then
later execute it. So what is the type of &(ps->*pf) ?
The standard does not assign any meaning to it except that it says
that this expression is not valid. According to 5.5 p6:
"If the result of .* or ->* is a function, then that result can be
used only as the operand for the function call operator ()."
Which means that the application of the address-of operator is not
supported.
I make a class:
template<class R, class O>
class ArrowStarVoidFunc
{
private:
R(O::*fptr)();
public:
ArrowStarVoidFunc(R(O::*f)()) : fptr(f) {}
R operator()(O* o) const { return (o->*fptr)(); }
};
template<class R, class O>
ArrowStarVoidFunc<R,O> operator->*(R(O::*f)())
{ return ArrowStarVoidFunc<R,O>(f); }
The latter declaration is invalid: A non-member overload of
operator->* needs to take two parameters.
Which seems to work fine except it also executes the function. What I
want to do is the following, but what goes where the ???? is:
template<class R, class O>
class ArrowStarVoidFunc
{
private:
R(O::*fptr)();
public:
ArrowStarVoidFunc(R(O::*f)()) : fptr(f) {}
???? operator()(O* o) const { return &(o->*fptr); }
};
You need to store both the O* value and the R(O::*fptr)() in the proxy
result object.
Isn't boost::bind() providing what you are considering to realize? See
http://www.boost.org/doc/libs/1_53_0/libs/bind/bind.html#with_member_pointers
Oh, and to make all this more interesting (i.e. complicated) I am
working with a compiler that is more than 10 years old and is only
compatible with C++98
Good luck ;-)
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]