Combine boost:: лексический бросок и std:: преобразование

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

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 ответов


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

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

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

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

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