diff --git a/include/boost/lambda2/lambda2.hpp b/include/boost/lambda2/lambda2.hpp index 2c2257d..f43197d 100644 --- a/include/boost/lambda2/lambda2.hpp +++ b/include/boost/lambda2/lambda2.hpp @@ -258,6 +258,14 @@ auto operator>>( A& a, B&& b ) return std::bind( lambda2_detail::right_shift(), std::ref(a), std::forward(b) ); } +// operator->* + +template> +auto operator->*( A&& a, B&& b ) +{ + return std::bind( std::forward(b), std::forward(a) ); +} + } // namespace lambda2 } // namespace boost diff --git a/test/Jamfile b/test/Jamfile index ac00c2e..a21728b 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -26,3 +26,4 @@ run subscript.cpp ; run compound.cpp ; run stream_insert.cpp ; run stream_extract.cpp ; +run project.cpp ; diff --git a/test/project.cpp b/test/project.cpp new file mode 100644 index 0000000..3ebfa47 --- /dev/null +++ b/test/project.cpp @@ -0,0 +1,62 @@ +// Copyright 2021 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include + +struct X +{ + int m1; + int m2; + + int f1() const + { + return m1; + } + + int& f2() + { + return m2; + } +}; + +int main() +{ + using namespace boost::lambda2; + + { + X const x{ 1, 2 }; + + BOOST_TEST_EQ( (_1->*&X::m1)( x ), 1 ); + BOOST_TEST_EQ( (_1->*&X::m2)( x ), 2 ); + BOOST_TEST_EQ( (_1->*&X::f1)( x ), 1 ); + } + + { + X x{ 0, 0 }; + + BOOST_TEST_EQ( (_1->*&X::m1)( x ), 0 ); + BOOST_TEST_EQ( (_1->*&X::m2)( x ), 0 ); + BOOST_TEST_EQ( (_1->*&X::f1)( x ), 0 ); + BOOST_TEST_EQ( (_1->*&X::f2)( x ), 0 ); + + BOOST_TEST_EQ( (_1->*&X::m1 += 1)( x ), 1 ); + BOOST_TEST_EQ( (_1->*&X::m2 += 2)( x ), 2 ); + + BOOST_TEST_EQ( (_1->*&X::f1)( x ), 1 ); + BOOST_TEST_EQ( (_1->*&X::f2)( x ), 2 ); + + BOOST_TEST_EQ( (_1->*&X::f2 += 3)( x ), 5 ); + } + + { + std::pair const x( 1, 2 ); + + BOOST_TEST_EQ( (_1->*&std::pair::first)( x ), 1 ); + BOOST_TEST_EQ( (_1->*&std::pair::second)( x ), 2 ); + } + + return boost::report_errors(); +}