2012-03-24 18 views
6

Mam następującą funkcję:Zwraca typ naprawdę długo wyrażenie

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

Jak widać nie wiem zwracanej wartości, a nawet jeśli kładę int tam i później skopiować typ z komunikatem o błędzie, jest to naprawdę długi typ ...
Czy istnieje sposób określenia typu zwracanego jako typ jedynego zwrotu w funkcji? czy istnieje jakieś obejście, które nie obejmuje dużego typu w typie zwrotnym?

+0

Typedefs to Twoi znajomi, możesz także zdefiniować metafunkcję, aby obliczyć typ zwrotu. – enobayram

+7

Możesz przenieść typedefs poza funkcję. Następnie możesz go użyć do zadeklarowania typu zwrotu. –

Odpowiedz

2

myślę, że należy robić to, co Raymond Chen zasugerował w komentarzu:

Przenieś się typedefs poza funkcją. Następnie możesz go użyć do zadeklarowania typu zwrotu.

Jeśli Raymond wysyła odpowiedź, należy ją zaakceptować zamiast mojej - umieszczam ją tak, że odpowiedź bitmask nie jest jedyna, ponieważ uważam, że jest ona gorsza od choroby.

0

Co z tym, jeśli nie chcesz, aby Twój typedef wyprowadził się.

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

Czy parametry po iteracji nie powinny pojawiać się po []? –

+0

@VaughnCato: Fajny połów, dzięki! Zmieniłem go z funkcji i zapomniałem przenieść listę parametrów. Zmieniono. – bitmask

+0

To jest pole minowe C++: operator potrójny, magia _1 (dwa razy!), Parametr bool podawany jako liczba, ale używany jako selektor, zmienna o nazwie tuż obok _1, decltype (dwa razy!), Auto (dwukrotnie !), wyrażeń lambda (dwa razy!), i nadal nie jestem pewien, czy jest całkowicie OK, jak decltype jest używany na "pierwszy", a nie "drugi". Nie jest jasne, jaka funkcja jest tutaj prezentowana, a teraz jest całkowicie nieprzenikniona. Rób to, co powiedział Raymond Chen - przyszli opiekunowie ci będą wdzięczni. –

Powiązane problemy