I see from the source code that the transform range is calling
make_transform_iterator which takes two arguments, and that
"If Reference
is use_default
then the reference
member of
transform_iterator
is
result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type."
The documentation for result_of explains the need, and shows how to
use a result template instead of a result_type simple type in this
case. My code follow from the example:
struct ASCII_lower
{
// tell details to result_of template, since VS8 doesn't
support decltype keyword.
template <typename> struct result;
template<typename F, typename T>
struct result<F(T)> { typedef T type; };
template< typename CharT >
CharT operator() (const CharT& ch) const
{
if (ch >= 'A' && ch <= 'Z') return ch+0x20;
return ch; // unchanged
}
};
But, I still get an error that result_type is not found!
B:\boost/iterator/transform_iterator.hpp(42) : error C2039:
'result_type' : is not a member of 'vst::internal::ASCII_lower'
B:\boost/mpl/eval_if.hpp(41) : see reference to class
template instantiation
'boost::detail::function_object_result<UnaryFunc>' being
compiled
with
[
UnaryFunc=vst::internal::ASCII_lower
]
B:\boost/iterator/iterator_adaptor.hpp(172) : see reference
to class template instantiation 'boost::mpl::eval_if<C,F1,F2>'
being compiled
with
[
C=boost::is_same<boost::use_default,boost::use_default>,
F1=boost::detail::function_object_result<vst::internal::ASCII_lower>,
F2=boost::mpl::identity<boost::use_default>
]
It appears to be using function_object_result, not result_of as
documented. And that is:
template <class UnaryFunc>
struct function_object_result
{
typedef typename UnaryFunc::result_type type;
};
which simply turns result_type into type to make eval_if happy, and
doesn't do anything fancier.
So, it doesn't work as documented, and neither provides another way
of passing the parameter in (exposing more arguments from the
underlying transform_iterator). Is that a bug, or what?
—John