home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.c++.moderated      Moderated discussion of C++ superhackery      33,346 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 32,893 of 33,346   
   =?ISO-8859-1?Q?Daniel_Kr=FCgler?= to Jerry   
   Re: currying pointer to member functions   
   07 Mar 13 00:10:27   
   
   d4526246   
   From: daniel.kruegler@googlemail.com   
      
   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 ArrowStarVoidFunc   
   >      {   
   >      private:   
   >          R(O::*fptr)();   
   >      public:   
   >          ArrowStarVoidFunc(R(O::*f)()) : fptr(f) {}   
   >          R operator()(O* o) const { return (o->*fptr)(); }   
   >      };   
   >   
   >      template   
   >      ArrowStarVoidFunc operator->*(R(O::*f)())   
   >          { return ArrowStarVoidFunc(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 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! ]   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca