text: // Copyright 2005 Alexander Nasonov.
  // 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)
  
  #include <boost/mpl/at.hpp>
  #include <boost/mpl/lambda.hpp>
  #include <boost/mpl/placeholders.hpp>
  #include <boost/mpl/transform.hpp>
  #include <boost/mpl/vector.hpp>
  #include <boost/static_assert.hpp>
  #include <boost/type_traits/is_same.hpp>
  #include <boost/type_traits/promote.hpp>
  
  namespace mpl = boost::mpl;
  
  int main()
  {
      using namespace mpl::placeholders;
  
      typedef mpl::vector< char
                         , signed char          // 1
                         , unsigned char
                         , short int const      // 3
                         , unsigned short int
                         , int volatile         // 5
                         , unsigned int         // 6
                         , long                 // 7
                         , unsigned long        // 8
                         , float const          // 9
                         > types;
  
      typedef mpl::transform< types
                            , mpl::lambda< boost::promote<_> >::type
                            >::type promoted;
  
      BOOST_STATIC_ASSERT(( ::boost::is_same< mpl::at_c<promoted,1>::type, int           >::value ));
      BOOST_STATIC_ASSERT(( ::boost::is_same< mpl::at_c<promoted,3>::type, int const     >::value ));
      BOOST_STATIC_ASSERT(( ::boost::is_same< mpl::at_c<promoted,5>::type, int volatile  >::value ));
      BOOST_STATIC_ASSERT(( ::boost::is_same< mpl::at_c<promoted,6>::type, unsigned int  >::value ));
      BOOST_STATIC_ASSERT(( ::boost::is_same< mpl::at_c<promoted,7>::type, long          >::value ));
      BOOST_STATIC_ASSERT(( ::boost::is_same< mpl::at_c<promoted,8>::type, unsigned long >::value ));
      BOOST_STATIC_ASSERT(( ::boost::is_same< mpl::at_c<promoted,9>::type, double const  >::value ));
  
      return 0;
  }
  
  