2010-02-13 3 views
6

Я хотел бы написать что-то подобное, что не может быть скомпилирован:Объединить повышение :: lexical_cast и станд :: преобразование

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

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

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

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

ответ

16

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

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

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

Thnx много, это работает отлично –

1

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

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

есть преимущество по сравнению с подходом, заданной UncleBens? –

+0

Не для вашего примера, в общем, это дает вам больше силы. Например, вы можете использовать IO-манипуляторы типа std :: hex или указать значение по умолчанию, которое используется в случае, если преобразование невозможно – Manuel