2012-03-24 10 views
6

tengo la siguiente función:Tipo de retorno muy largo expresión

inline auto iterateSomething(obj & o) 
{ 
    auto iterators = baseIterator(o); 
    auto tranformer = boost::bind(transofrmToSomething, _1, o); 
    typedef boost::transform_iterator<decltype(tranformer), decltype(iterators.first)> iterator_t; 
    iterator_t begin(iterators.first, tranformer); 
    iterator_t end(iterators.second, tranformer); 
    return std::make_pair(begin, end); 
} 

Como se puede ver no sé el valor de retorno e incluso si pongo int allí y luego copiar el tipo de mensaje de error, es un tipo muy largo ...
¿Hay alguna forma de especificar el tipo de devolución como el tipo de retorno único en la función? ¿hay alguna solución que no implique un tipo enorme en el tipo de devolución?

+0

typedefs son sus amigos, también podría definir una metafunción para calcular el tipo de devolución. – enobayram

+7

Puede mover los typedefs fuera de la función. Entonces puede usarlo para declarar el tipo de devolución. –

Respuesta

2

creo que debe hacer lo que Raymond Chen sugirió en un comentario:

Mover los typedefs fuera de la función. Entonces puede usarlo para declarar el tipo de devolución.

Si Raymond publica una respuesta, debe aceptarse con preferencia a la mía. Estoy publicando esto para que la respuesta de la máscara de bits no sea la única, ya que creo que es una cura peor que la enfermedad.

0

¿Qué tal si no quiere que su typedef se mudó?

auto getIt = [] (obj& o, bool getEnd) { 
    return boost::transform_iterator< 
      decltype(boost::bind(transofrmToSomething, _1, o)), 
      decltype(baseIterator(o).first) 
     >(
      getEnd ? baseIterator(o).second : baseIterator(o).first, 
      boost::bind(transofrmToSomething, _1, o) 
     ); 
} 

auto iterateSomething = [] (obj & o) { 
    return std::make_pair(getIt(o,false), getIt(o,true)); 
} 
+0

¿No deberían los parámetros para iterateSomething venir después de []? –

+0

@VaughnCato: Buena captura, gracias! Lo cambié de una función y olvidé mover la lista de parámetros. Cambiado – bitmask

+0

Este es un campo de minas en C++: un operador ternario, el _1 mágico (¡dos veces!), Un parámetro bool dado como un número aún utilizado como selector, una variable llamada o junto a _1, decltype (¡dos veces!), Automático (dos veces !), expresiones lambda (¡dos veces!), y todavía no estoy seguro de si está totalmente bien cómo se usa decltype en el "primer" y no el "segundo". Apenas queda claro qué funcionalidad se está presentando aquí, y ahora es totalmente impenetrable. Haz lo que dijo Raymond Chen: los futuros mantenedores te lo agradecerán. –

Cuestiones relacionadas