Как использовать выражение феникса с повышением:: transform_iterator?

<Обновление>, Как обычно, для меня, вопросом был неправильный. Фактический вопрос: почему не делает использования transform_iterator стандартный result_of <> метафункция для определения типа возврата, вместо того, чтобы получить доступ к UnaryFunc:: result_type непосредственно. Отправленный ответ с работой вокруг. </Обновление>

А именно, есть ли способ заставить выражение феникса выставить a result_type введите как ожидалось для станд.:: понятие unary_function? повышение:: transform_iterator, кажется, ожидает это, и от рассмотрения src его, я не вижу простую работу вокруг.

Вот некоторый код, который воспроизводит проблему, которую я имел:

#include <boost/iterator/transform_iterator.hpp>
#include <boost/spirit/home/phoenix.hpp>
#include <numeric>
#include <iostream>

using namespace boost::phoenix;
using namespace boost::phoenix::arg_names;

int main(void){
   int i[] = {4,2,5,3};

   std::cout <<
      std::accumulate(
         boost::make_transform_iterator(i,   _1*_1),
         boost::make_transform_iterator(i+4, _1*_1),
         0
      ) << std::endl;

   return 0;
}

relavent часть сообщения об ошибке от компиляции этого (gcc 4.3.4, повысьте 1.43):

/usr/include/boost/iterator/transform_iterator.hpp:43: error: no type named ‘result_type’ in ‘struct boost::phoenix::actor<...

У меня есть та же проблема с повышением:: лямбда (пропавшие без вести result_type). Я думал, что видел подобное использование для make_transform_iterator и лямбды в прошлом теперь, я задаюсь вопросом, вообразил ли я просто это.

Есть ли обеспеченная обертка или некоторый другой механизм у феникса или лямбды для представления result_type?

5
задан academicRobot 22 June 2010 в 19:00
поделиться

1 ответ

Похоже, это исправлено в соединительной линии повышения (см. Строку 51, result_of <> вместо косвенного UnaryFunc :: результат_типа ). Так что это не должно быть проблемой в 1.44 и выше.

Вот обходной путь для boost <1,44. Создание экземпляра transform_iterator обращается к UnaryFunc :: result_type , только если не указан параметр шаблона Ссылка . Таким образом, одна уловка состоит в том, чтобы заменить make_transform_iterator версией, которая вызывает мета-функцию result_of <> в UnaryFunc и использовать результат для параметра шаблона ссылки.

#include <boost/iterator/transform_iterator.hpp>
#include <boost/utility.hpp>
#include <iterator>

template <class UnaryFunc, class Iterator>
boost::transform_iterator<
   UnaryFunc,
   Iterator,
   typename boost::result_of<
      UnaryFunc(typename std::iterator_traits<Iterator>::value_type)
   >::type
>
make_trans_it(Iterator it, UnaryFunc fun){
   return
      boost::transform_iterator<
         UnaryFunc,
         Iterator,
         typename boost::result_of<
            UnaryFunc(typename std::iterator_traits<Iterator>::value_type)
         >::type
      >(it, fun);
};
4
ответ дан 15 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: