Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combine boost::lexical_cast and std::transform

I would like to write something like this, which cannot be compiled:

std::vector<A> as;
std::vector<B> bs( as.size() );
std::transform( as.beginn(), as.end(), bs.begin(), boost::lexical_cast<B> );

But this is not working, so I created a functor which is doing this for me:

template<typename Dest>
struct lexical_transform
{
    template<typename Src>
    Dest operator()( const Src& src ) const
    {
        return boost::lexical_cast<Dest>( src );
    }
};

Is there an easier way to do this?

like image 932
Mathias Soeken Avatar asked Feb 13 '10 20:02

Mathias Soeken


2 Answers

lexical_cast has two template arguments: target type and source type. Under normal usage, the second is deduced from the call.

However, here you want to take the address of the function, and you need to specify all the template arguments:

std::transform( as.begin(), as.end(), bs.begin(), boost::lexical_cast<B, A> );
like image 111
UncleBens Avatar answered Sep 20 '22 00:09

UncleBens


If you do this kind of thing a lot you might want to consider the Boost.Convert library (not an accepted part of Boost yet). See this example from the manual:

std::transform(strings.begin(), strings.end(),
               std::back_inserter(integers),
               boost::convert<int>::from<string>());
like image 33
Manuel Avatar answered Sep 20 '22 00:09

Manuel