Объедините boost :: lexical_cast и std :: transform - PullRequest
6 голосов
/ 13 февраля 2010

Я хотел бы написать что-то вроде этого, которое не может быть скомпилировано:

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

Но это не работает, поэтому я создал функтор, который делает это для меня:

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

Есть ли более простой способ сделать это?

Ответы [ 2 ]

16 голосов
/ 13 февраля 2010

lexical_cast имеет два аргумента шаблона: тип цели и тип источника. При обычном использовании второй выводится из вызова.

Однако здесь вы хотите взять адрес функции, и вам нужно указать все аргументы шаблона:

std::transform( as.begin(), as.end(), bs.begin(), boost::lexical_cast<B, A> );
1 голос
/ 13 февраля 2010

Если вы много делаете такого рода вещи, вы можете рассмотреть библиотеку Boost.Convert (еще не принятую часть Boost). Смотрите этот пример из руководства:

std::transform(strings.begin(), strings.end(),
               std::back_inserter(integers),
               boost::convert<int>::from<string>());
...