2012-03-24 19 views
6

Ho la seguente funzione:Tipo di ritorno molto lungo espressione

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); 
} 

Come potete vedere non so il valore di ritorno e anche se ho messo int lì e poi copiare il tipo dal messaggio di errore, è un tipo davvero lungo ...
C'è un modo per specificare il tipo di ritorno come il tipo di ritorno solo nella funzione? c'è qualche soluzione alternativa che non coinvolge un tipo enorme nel tipo di reso?

+0

typedef sono i tuoi amici, potresti anche definire una metafunzione per calcolare il tipo di ritorno. – enobayram

+7

È possibile spostare i typedef all'esterno della funzione. Quindi puoi usarlo per dichiarare il tipo di reso. –

risposta

2

Penso che si dovrebbe fare quello che Raymond Chen ha suggerito in un commento:

Spostare le typedef al di fuori della funzione. Quindi puoi usarlo per dichiarare il tipo di reso.

Se Raymond distacca una risposta che dovrebbe essere accettato a preferenza di miniera - sto postando questo modo risposta che di maschera di bit non è l'unico, in quanto penso che sia una cura peggiore del male.

0

Che dire di questo, se non si desidera spostare lo typedef.

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

Non dovrebbero i parametri per iterateSomething venire dopo []? –

+0

@VaughnCato: Bella cattura, grazie! L'ho cambiato da una funzione e ho dimenticato di spostare la lista dei parametri. Cambiato. – bitmask

+0

Questo è un campo minato C++: un operatore ternario, la magia _1 (due volte!), Un parametro bool dato come un numero ancora usato come selettore, una variabile chiamata o proprio accanto a _1, decltype (due volte!), Auto (due volte !), espressioni lambda (due volte!), e non sono ancora sicuro se è totalmente OK come decltype viene utilizzato sul "primo" e non sul "secondo". È appena chiaro quale funzionalità è stata presentata qui e ora è totalmente impenetrabile. Fai quello che ha detto Raymond Chen: i futuri manutentori ti ringrazieranno. –