naming delayed variables string in boost lamdba
Hi AllI am getting familiar with boost::lambda.Today I learnt about delayed variable and usage of boost::constant in lambda expression.Do you know why when I try to declare delayed variables for string like I do belowthe compiler gives me each time an error?I tried the following constant_type<const char*>::type _msg_a(constant("my msg"));constant_type<const std::string>::type _msg_b(constant("my msg"));constant_type<std::string>::type _msg_c(constant("my msg")); If I use constant( "my msg" ) inside a boost lambda expression everythingis fine but I cannot declare correctly a delayed variable.Do you know how to fix it or where I can get some details?Thanks in advanceMn _________________________________________________________________ Facile, veloce, sicuro: scarica Internet Explorer 8 per MSN http://www.microsoft.com/italy/windows/internet-explorer/msn.aspx
2009/11/11 Emanuele Rocci <rocciemanuele@hotmail.com>
Hi All I am getting familiar with boost::lambda. Today I learnt about delayed variable and usage of boost::constant in lambda expression. Do you know why when I try to declare delayed variables for string like I do below the compiler gives me each time an error? I tried the following
constant_type<const char*>::type _msg_a(constant("my msg")); constant_type<const std::string>::type _msg_b(constant("my msg")); constant_type<std::string>::type _msg_c(constant("my msg"));
If I use constant( "my msg" ) inside a boost lambda expression everything is fine but I cannot declare correctly a delayed variable. Do you know how to fix it or where I can get some details? Thanks in advance Mn
Function objects generated by lambda have unspecified types. If you want to save them, use Boost.Function. #include <iostream> #include <boost/lambda/core.hpp> #include <boost/function.hpp> int main() { boost::function<const char*()> f = boost::lambda::constant("hello"); std::cout << f() << std::endl; } Roman Perepelitsa
On Wed, Nov 11, 2009 at 9:24 AM, Roman Perepelitsa <roman.perepelitsa@gmail.com> wrote:
2009/11/11 Emanuele Rocci <rocciemanuele@hotmail.com>
Hi All I am getting familiar with boost::lambda. Today I learnt about delayed variable and usage of boost::constant in lambda expression. Do you know why when I try to declare delayed variables for string like I do below the compiler gives me each time an error? I tried the following constant_type<const char*>::type _msg_a(constant("my msg")); constant_type<const std::string>::type _msg_b(constant("my msg")); constant_type<std::string>::type _msg_c(constant("my msg")); If I use constant( "my msg" ) inside a boost lambda expression everything is fine but I cannot declare correctly a delayed variable. Do you know how to fix it or where I can get some details? Thanks in advance Mn
Function objects generated by lambda have unspecified types. If you want to save them, use Boost.Function. #include <iostream> #include <boost/lambda/core.hpp> #include <boost/function.hpp> int main() { boost::function<const char*()> f = boost::lambda::constant("hello"); std::cout << f() << std::endl; }
Or BOOST_AUTO (which will have lower overhead then Boost.Function).
HI Roman!Thanks for your nice response! I have just discovered another way.Please give me your comments!constant_type< const char[7] >::type _name(constant("value: "));playing the same role ofboost::function<const char*()> _name = boost::lambda::constant("value: ");I find both 2 nice ways of expressing constant string in a lamda expression. Using the boost::function approach, some sample code can be written like the following using round brackets next to _name variable.std::for_each( myList.begin(),myList.end(),( std::cout << _name() << _1 , _1 = 2 ));I find the approach using boost::function very nice since it provides more the "genericity" feeling; you don't have to declare the size of the string but it is enough const char*().With the constant_type way it is possible to use _name as a common const variable without using round bracketsstd::for_each( myList.begin(),myList.end(),( std::cout << _name << _1 , _1 = 2 ));This works fine provided that the size is correct; it is probably not always nice, but compiler will complain if the size is not correct i.e. if you use const char[6] or if you use const char[8].Now I am wondering which is the fastest approach. I guess that probably they are the same. You commnnts or opinion are appreciated and off course thanks!ManuDate: Wed, 11 Nov 2009 17:24:35 +0100 From: roman.perepelitsa@gmail.com To: boost-users@lists.boost.org Subject: Re: [Boost-users] naming delayed variables string in boost lamdba 2009/11/11 Emanuele Rocci <rocciemanuele@hotmail.com> Hi AllI am getting familiar with boost::lambda.Today I learnt about delayed variable and usage of boost::constant in lambda expression.Do you know why when I try to declare delayed variables for string like I do below the compiler gives me each time an error?I tried the following constant_type<const char*>::type _msg_a(constant("my msg"));constant_type<const std::string>::type _msg_b(constant("my msg")); constant_type<std::string>::type _msg_c(constant("my msg")); If I use constant( "my msg" ) inside a boost lambda expression everythingis fine but I cannot declare correctly a delayed variable. Do you know how to fix it or where I can get some details?Thanks in advanceMn Function objects generated by lambda have unspecified types. If you want to save them, use Boost.Function. #include <iostream>#include <boost/lambda/core.hpp> #include <boost/function.hpp> int main() { boost::function<const char*()> f = boost::lambda::constant("hello"); std::cout << f() << std::endl;} Roman Perepelitsa _________________________________________________________________ Scrivi, parla, gioca... Scopri Messenger 2009 http://www.messenger.it/home_comunica.aspx
2009/11/11 Emanuele Rocci <rocciemanuele@hotmail.com>
HI Roman! Thanks for your nice response! I have just discovered another way. Please give me your comments!
constant_type< const char[7] >::type _name(constant("value: "));
playing the same role of
boost::function<const char*()> _name = boost::lambda::constant("value: ");
I find both 2 nice ways of expressing constant string in a lamda expression.
Using the boost::function approach, some sample code can be written like the following using round brackets next to _name variable.
std::for_each( myList.begin(),myList.end(),( std::cout << _name() << _1 , _1 = 2 ));
This does not do what you think it does. It'll evaluate and output _name() only once. Here's how you can fix it: std::for_each( myList.begin(),myList.end(),( std::cout << bind(_name) << _1 , _1 = 2 ));
I find the approach using boost::function very nice since it provides more the "genericity" feeling; you don't have to declare the size of the string but it is enough const char*().
With the constant_type way it is possible to use _name as a common const variable without using round brackets
std::for_each( myList.begin(),myList.end(),( std::cout << _name << _1 , _1 = 2 ));
This works as expected -- _name is being output several times.
This works fine provided that the size is correct; it is probably not always nice, but compiler will complain if the size is not correct i.e. if you use const char[6] or if you use const char[8].
Now I am wondering which is the fastest approach. I guess that probably they are the same.
Using constant_type should be faster, because it does not use virtual functions. Also, to my surprise, it's a documented way of creating lazy constants (see http://www.boost.org/doc/libs/1_40_0/doc/html/lambda/le_in_details.html#lamb... ). Roman Perepelitsa.
participants (4)
-
Emanuele Rocci
-
OvermindDL1
-
Roman Perepelitsa
-
Ryan McConnehey