2010-02-13 8 views
6

me gustaría escribir algo como esto, que no puede ser compilado:Combinar impulso :: lexical_cast y std :: transformar

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

Pero esto no está funcionando, así que creé un funtor que está haciendo esto para yo:

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

¿Hay alguna manera más fácil de hacerlo?

Respuesta

16

lexical_cast tiene dos argumentos de plantilla: tipo de destino y tipo de fuente. En uso normal, el segundo se deduce de la llamada.

Sin embargo, aquí se quiere tomar la dirección de la función, y es necesario especificar todos los argumentos de plantilla:

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

thnx mucho, funciona perfecto –

1

Si lo hace este tipo de cosas mucho es posible que desee considerar la Boost.Convert biblioteca (no es una parte aceptada de Boost aún). Vea este ejemplo en el manual:

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

no es una ventaja en comparación con el enfoque dado por UncleBens? –

+0

No es realmente para su ejemplo, ya que en general le da más poder. Por ejemplo, puede usar manipuladores IO como std :: hex o especificar un valor predeterminado que se usa en caso de que la conversión no sea posible – Manuel

Cuestiones relacionadas