2010-02-13 15 views
6

Chciałbym napisać coś takiego, które nie mogą być skompilowane:Kombajny boost :: lexical_cast i std :: przekształcić

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

Ale to nie działa, więc stworzyłem funktor, który robi to dla ja:

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

Czy jest łatwiejszy sposób to zrobić?

Odpowiedz

16

lexical_cast ma dwa argumenty szablonu: typ celu i typ źródła. Przy normalnym użytkowaniu drugi wywodzi się z połączenia.

Jednak tutaj chcesz wziąć adres funkcji i trzeba określić wszystkie argumenty szablonu:

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

thnx dużo, to działa idealnie –

1

Jeśli do tego typu rzeczy dużo warto rozważyć Boost.Convert biblioteka (jeszcze nie przyjęta część Boost). Zobacz ten przykład z podręcznika:

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

tam jest zaletą w porównaniu z podejściem określonym przez UncleBens? –

+0

Niezupełnie za twój przykład, ponieważ generalnie daje ci większą moc. Na przykład można użyć manipulatorów IO takich jak std :: hex lub określić wartość domyślną, która jest używana w przypadku, gdy konwersja nie jest możliwa – Manuel

Powiązane problemy