/////////////////////////////////////////////////////////////////////////////// // noinvoke.hpp // // Copyright 2008 Eric Niebler. Distributed under the Boost // Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #define BOOST_TEST_MAIN #include #include #include #include #include namespace proto=boost::proto; using proto::_; struct Test : proto::when< _ , proto::noinvoke< // This remove_pointer invocation is bloked by noinvoke boost::remove_pointer< // This add_pointer invocation is *not* blocked by noinvoke boost::add_pointer<_> > >() > {}; struct Test2 : proto::when< _ // This add_pointer gets invoked because a substitution takes place // within it. , boost::add_pointer< proto::noinvoke< // This remove_pointer invocation is bloked by noinvoke boost::remove_pointer< // This add_pointer invocation is *not* blocked by noinvoke boost::add_pointer<_> > > >() > {}; template struct select2nd { typedef U type; }; struct Test3 : proto::when< _ // This add_pointer gets invoked because a substitution takes place // within it. , select2nd< void , proto::noinvoke< // This remove_pointer invocation is bloked by noinvoke select2nd< void // This add_pointer invocation is *not* blocked by noinvoke , boost::add_pointer<_> > > >() > {}; BOOST_AUTO_TEST_CASE(test_noinvoke) { typedef proto::terminal::type Int; Int i = {42}; BOOST_MPL_ASSERT(( boost::is_same< boost::result_of::type , boost::remove_pointer > )); boost::remove_pointer t = Test()(i); BOOST_MPL_ASSERT(( boost::is_same< boost::result_of::type , boost::remove_pointer * > )); boost::remove_pointer * t2 = Test2()(i); BOOST_MPL_ASSERT(( boost::is_same< boost::result_of::type , select2nd > )); select2nd t3 = Test3()(i); }