forked from boostorg/fusion
fusion fold and transform passing refs for lvalues as per result_of protocol
[SVN r38039]
This commit is contained in:
@ -19,13 +19,12 @@
|
||||
|
||||
struct square
|
||||
{
|
||||
template<typename T>
|
||||
template<typename Sig>
|
||||
struct result;
|
||||
|
||||
template <typename T>
|
||||
struct result<square(T)>
|
||||
{
|
||||
BOOST_STATIC_ASSERT(!boost::is_reference<T>::value);
|
||||
typedef int type;
|
||||
};
|
||||
|
||||
@ -38,7 +37,7 @@ struct square
|
||||
|
||||
struct add
|
||||
{
|
||||
template<typename T>
|
||||
template<typename Sig>
|
||||
struct result;
|
||||
|
||||
template <typename A, typename B>
|
||||
@ -54,6 +53,42 @@ struct add
|
||||
}
|
||||
};
|
||||
|
||||
struct unary_lvalue_transform
|
||||
{
|
||||
template<typename Sig>
|
||||
struct result;
|
||||
|
||||
template<typename T>
|
||||
struct result<unary_lvalue_transform(T&)>
|
||||
{
|
||||
typedef T* type;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
T* operator()(T& t) const
|
||||
{
|
||||
return &t;
|
||||
}
|
||||
};
|
||||
|
||||
struct binary_lvalue_transform
|
||||
{
|
||||
template<typename Sig>
|
||||
struct result;
|
||||
|
||||
template<typename T0, typename T1>
|
||||
struct result<binary_lvalue_transform(T0&,T1&)>
|
||||
{
|
||||
typedef T0* type;
|
||||
};
|
||||
|
||||
template<typename T0, typename T1>
|
||||
T0* operator()(T0& t0, T1&) const
|
||||
{
|
||||
return &t0;
|
||||
}
|
||||
};
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
@ -92,6 +127,20 @@ main()
|
||||
BOOST_TEST((transform(tup1, tup2, add()) == make_vector(5, 7, 9)));
|
||||
}
|
||||
|
||||
{
|
||||
// Unary transform that requires lvalues, just check compilation
|
||||
vector<int, int, int> tup1(1, 2, 3);
|
||||
BOOST_TEST(at_c<0>(transform(tup1, unary_lvalue_transform())) == &at_c<0>(tup1));
|
||||
BOOST_TEST(*begin(transform(tup1, unary_lvalue_transform())) == &at_c<0>(tup1));
|
||||
}
|
||||
|
||||
{
|
||||
vector<int, int, int> tup1(1, 2, 3);
|
||||
vector<int, int, int> tup2(4, 5, 6);
|
||||
BOOST_TEST(at_c<0>(transform(tup1, tup2, binary_lvalue_transform())) == &at_c<0>(tup1));
|
||||
BOOST_TEST(*begin(transform(tup1, tup2, binary_lvalue_transform())) == &at_c<0>(tup1));
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user