<Обновление>, Как обычно, для меня, вопросом был неправильный. Фактический вопрос: почему не делает использования 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
?
Похоже, это исправлено в соединительной линии повышения (см. Строку 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);
};