Я хотел бы записать что-то вроде этого, которое не может быть скомпилировано:
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 );
}
};
Существует ли более легкий способ сделать это?
lexical_cast
имеет два аргумента шаблона: целевой тип и исходный тип. При нормальном использовании второй выводится из вызова.
Однако здесь вы хотите взять адрес функции и указать все аргументы шаблона:
std::transform( as.begin(), as.end(), bs.begin(), boost::lexical_cast<B, A> );
Если вы часто занимаетесь подобными вещами, вы можете рассмотреть библиотеку Boost.Convert (не принимаемая часть Boost еще). См. Этот пример из руководства:
std::transform(strings.begin(), strings.end(),
std::back_inserter(integers),
boost::convert<int>::from<string>());