naming delayed variables string in boost lamdba

View: New views
6 Messages — Rating Filter:   Alert me  

naming delayed variables string in boost lamdba

by manustone :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Some parts of this message have been removed. Learn more about Nabble's security policy.
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


Chiacchiera con i tuoi amici da Messenger.it
_______________________________________________
Boost-users mailing list
Boost-users@...
http://lists.boost.org/mailman/listinfo.cgi/boost-users

Re: naming delayed variables string in boost lamdba

by Roman Perepelitsa-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

2009/11/11 Emanuele Rocci <rocciemanuele@...>
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

_______________________________________________
Boost-users mailing list
Boost-users@...
http://lists.boost.org/mailman/listinfo.cgi/boost-users

Re: naming delayed variables string in boost lamdba

by OvermindDL1 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Wed, Nov 11, 2009 at 9:24 AM, Roman Perepelitsa
<roman.perepelitsa@...> wrote:

> 2009/11/11 Emanuele Rocci <rocciemanuele@...>
>>
>> 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).
_______________________________________________
Boost-users mailing list
Boost-users@...
http://lists.boost.org/mailman/listinfo.cgi/boost-users

Re: naming delayed variables string in boost lamdba

by Ryan McConnehey :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

OvermindDL1 wrote:
On Wed, Nov 11, 2009 at 9:24 AM, Roman Perepelitsa
roman.perepelitsa@... wrote:
  
2009/11/11 Emanuele Rocci rocciemanuele@...
    
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).
_______________________________________________
Boost-users mailing list
Boost-users@...
http://lists.boost.org/mailman/listinfo.cgi/boost-users
Could you translate the example to use BOOST_AUTO in place of Boost.Function?

Ryan

_______________________________________________
Boost-users mailing list
Boost-users@...
http://lists.boost.org/mailman/listinfo.cgi/boost-users

Re: naming delayed variables string in boost lamdba

by manustone :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Some parts of this message have been removed. Learn more about Nabble's security policy.

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
            ));
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 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!
Manu

Date: Wed, 11 Nov 2009 17:24:35 +0100
From: roman.perepelitsa@...
To: boost-users@...
Subject: Re: [Boost-users] naming delayed variables string in boost lamdba

2009/11/11 Emanuele Rocci <rocciemanuele@...>
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


Il tormentone dell'estate? Riascoltalo sulla Messenger Radio
_______________________________________________
Boost-users mailing list
Boost-users@...
http://lists.boost.org/mailman/listinfo.cgi/boost-users

Re: naming delayed variables string in boost lamdba

by Roman Perepelitsa-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

2009/11/11 Emanuele Rocci <rocciemanuele@...>

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#lambda.delaying_constants_and_variables).

Roman Perepelitsa.

_______________________________________________
Boost-users mailing list
Boost-users@...
http://lists.boost.org/mailman/listinfo.cgi/boost-users