Iterator: Use boost::result_of to determine nested result type of function in transform_iterator. Fixes #1427.

[SVN r70715]
This commit is contained in:
Daniel James
2011-03-29 21:31:29 +00:00
parent 1ca1caddff
commit 5d72ae48da
2 changed files with 36 additions and 20 deletions

View File

@ -102,6 +102,17 @@ int mult_2(int arg)
return arg*2;
}
struct polymorphic_mult_functor
{
//Implement result_of protocol
template <class FArgs> struct result;
template <class F, class T> struct result<F(T )> {typedef T type;};
template <class F, class T> struct result<F(T& )> {typedef T type;};
template <class F, class T> struct result<F(const T&)> {typedef T type;};
template <class T>
T operator()(const T& _arg) const {return _arg*2;}
};
int
main()
@ -244,5 +255,25 @@ main()
);
}
// Test transform_iterator with polymorphic object function
{
int x[N], y[N];
for (int k = 0; k < N; ++k)
x[k] = k;
std::copy(x, x + N, y);
for (int k2 = 0; k2 < N; ++k2)
x[k2] = x[k2] * 2;
boost::input_iterator_test(
boost::make_transform_iterator(y, polymorphic_mult_functor()), x[0], x[1]);
boost::input_iterator_test(
boost::make_transform_iterator(&y[0], polymorphic_mult_functor()), x[0], x[1]);
boost::random_access_readable_iterator_test(
boost::make_transform_iterator(y, polymorphic_mult_functor()), N, x);
}
return boost::report_errors();
}