Тип возврата действительно длинное выражение - PullRequest
6 голосов
/ 24 марта 2012

У меня есть следующая функция:

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

Как видите, я не знаю возвращаемого значения, и даже если я добавлю туда int и позже скопирую тип из сообщения об ошибке, это действительноlong type ...
Есть ли способ указать тип возвращаемого значения как тип единственного возврата в функции?есть ли обходной путь, не связанный с огромным типом в возвращаемом типе?

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

Я думаю, вы должны сделать то, что предложил Раймонд Чен в комментарии:

Переместите typedefs за пределы функции.Затем вы можете использовать его, чтобы объявить тип возвращаемого значения.

Если Раймонд публикует ответ, его следует принять вместо моего - я публикую это так, чтобы ответ битмаски был не единственнымтак как я думаю, что это лекарство хуже, чем болезнь.

0 голосов
/ 24 марта 2012

Как насчет этого, если вы не хотите, чтобы ваш 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));
}
...