Function or Bind question
The command-line-argument library has a callback function 'notifier' used like this: po::wvaluestd::wstring()->notifier(&foo) If I write void foo (const std::wstring& s) { C::bar(s); } it works fine. wstring and void are the template arguments to the function object. Now if I write notifier(&C::bar) instead, I get a huge spiel of compiler errors. Yet, from the body of foo you can see that s can be implicitly converted to the type of bar's argument (const boost::filesystem::wpath&) and the return type is also void. I thought that generalized functions objects pretty much worked that if you can write the call in normal code, it makes the correct wrapper to do that. What am I missing? --John TradeStation Group, Inc. is a publicly-traded holding company (NASDAQ GS: TRAD) of three operating subsidiaries, TradeStation Securities, Inc. (Member NYSE, FINRA, SIPC and NFA), TradeStation Technologies, Inc., a trading software and subscription company, and TradeStation Europe Limited, a United Kingdom, FSA-authorized introducing brokerage firm. None of these companies provides trading or investment advice, recommendations or endorsements of any kind. The information transmitted is intended only for the person or entity to which it is addressed and may contain confidential and/or privileged material. Any review, retransmission, dissemination or other use of, or taking of any action in reliance upon, this information by persons or entities other than the intended recipient is prohibited. If you received this in error, please contact the sender and delete the material from any computer.
Le 13/08/2010 17:49, John Dlugosz a écrit :
What am I missing?
A good C++ book :) Like Effective STL from Scott Meyers, Item 41. In short, you must adapt your function with std::mem_fun_ref. But boost offer more powerfull solution (bind), then you can write: C c ; // ... verbode_thing.notifier(boost::bind(&C::bar, boost::ref(c), _1) ) More details at http://www.boost.org/doc/libs/1_43_0/libs/bind/bind.html -- Mickaël Wolff aka Lupus Michaelis Racine http://lupusmic.org Blog http://blog.lupusmic.org
What am I missing?
A good C++ book :) Like Effective STL from Scott Meyers, Item 41.
In short, you must adapt your function with std::mem_fun_ref. But boost offer more powerfull solution (bind), then you can write:
C c ; // ... verbode_thing.notifier(boost::bind(&C::bar, boost::ref(c), _1) )
More details at http://www.boost.org/doc/libs/1_43_0/libs/bind/bind.html
Actually, none of that made any difference. The problem was that the function was overloaded, and it didn't know which to use without explicit cast. Giving the function a unique name, it worked as written. I did read the instructions, BTW. It looked like it ought to work exactly the way I did. And it was only the overloading that threw it off. What about the original I posted made you think that it needs an explict call to bind? And it's static, so your rewrite isn't right anyway. TradeStation Group, Inc. is a publicly-traded holding company (NASDAQ GS: TRAD) of three operating subsidiaries, TradeStation Securities, Inc. (Member NYSE, FINRA, SIPC and NFA), TradeStation Technologies, Inc., a trading software and subscription company, and TradeStation Europe Limited, a United Kingdom, FSA-authorized introducing brokerage firm. None of these companies provides trading or investment advice, recommendations or endorsements of any kind. The information transmitted is intended only for the person or entity to which it is addressed and may contain confidential and/or privileged material. Any review, retransmission, dissemination or other use of, or taking of any action in reliance upon, this information by persons or entities other than the intended recipient is prohibited. If you received this in error, please contact the sender and delete the material from any computer.
participants (2)
-
John Dlugosz
-
Mickael Wolff