2010-02-13 4 views
6

Ich möchte so etwas schreiben, die zusammengestellt werden können:Kombinieren boost :: lexical_cast und std :: transformieren

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

Aber dies nicht funktioniert, so habe ich ein Funktor, die dies tut für Ich:

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

Gibt es eine einfachere Möglichkeit, dies zu tun?

Antwort

16

lexical_cast hat zwei Vorlagenargumente: Zieltyp und Quelltyp. Bei normaler Verwendung wird die zweite vom Anruf abgeleitet.

aber hier möchten Sie die Adresse der Funktion zu übernehmen, und Sie müssen alle Template-Argumente angeben:

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

thnx viel, es funktioniert perfekt –

1

Wenn Sie diese Art der Sache zu tun viel Sie könnten die Boost.Convert berücksichtigen wollen Bibliothek (noch kein akzeptierter Teil von Boost). Sehen Sie dieses Beispiel aus dem Handbuch:

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

ist es ein Vorteil gegenüber dem Ansatz von UncleBens gegeben? –

+0

Nicht wirklich für dein Beispiel, weil es im Allgemeinen deine mehr Macht gibt. Zum Beispiel können Sie IO-Manipulatoren wie std :: hex verwenden oder einen Standardwert angeben, der für den Fall verwendet wird, dass die Konvertierung nicht möglich ist – Manuel