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>());