2010-02-13 8 views
6

Je voudrais écrire quelque chose comme ça, qui ne peut être compilé:Combiner boost :: lexical_cast et std :: transformer

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

Mais cela ne fonctionne pas, donc je créé un foncteur qui fait cela pour moi:

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

Existe-t-il un moyen plus facile de faire cela?

Répondre

16

lexical_cast possède deux arguments de modèle: type de cible et type de source. En utilisation normale, la seconde est déduite de l'appel.

Cependant, ici vous voulez prendre l'adresse de la fonction, et vous devez spécifier tous les arguments de modèle:

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

thnx beaucoup, il fonctionne parfaitement –

1

Si vous faites ce genre de chose beaucoup vous voudrez peut-être envisager la Boost.Convert bibliothèque (pas une partie acceptée de Boost encore). Voir cet exemple du manuel:

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

est-il un avantage par rapport à l'approche donnée par Unclebens? –

+0

Pas vraiment pour votre exemple car en général il donne plus de puissance. Par exemple, vous pouvez utiliser des manipulateurs IO comme std :: hex ou spécifier une valeur par défaut qui est utilisée dans le cas où la conversion n'est pas possible – Manuel

Questions connexes