Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/libs/mpl/doc/src/refmanual/NumericMetafunction.rst @ 29

Last change on this file since 29 was 29, checked in by landauf, 17 years ago

updated boost from 1_33_1 to 1_34_1

File size: 3.9 KB

Numeric Metafunction

Description

A |Numeric Metafunction| is a |tag dispatched metafunction| that provides a built-in infrastructure for easy implementation of mixed-type operations.

Expression requirements

|In the following table...| op is a placeholder token for the actual |Numeric Metafunction|'s name, and x, y and |x1...xn| are arbitrary numeric types.

Expression Type Complexity
op_tag<x>::type |Integral Constant| Amortized constant time.
op_impl<
     op_tag<x>::type
   , op_tag<y>::type
   >::apply<x,y>::type
Any type Unspecified.
op<|x1...xn|>::type Any type Unspecified.

Expression semantics

typedef op_tag<x>::type tag;
Semantics:tag is a tag type for x for op. tag::value is x's conversion rank.
typedef op_impl<
      op_tag<x>::type
    , op_tag<y>::type
    >::apply<x,y>::type r;
Semantics:r is the result of op application on arguments x and y.
typedef op<|x1...xn|>::type r;
Semantics:r is the result of op application on arguments |x1...xn|.

Example

struct complex_tag : int_<10> {};
template< typename Re, typename Im > struct complex
{
    typedef complex_tag tag;
    typedef complex type;
    typedef Re real;
    typedef Im imag;
};
template< typename C > struct real : C::real {};
template< typename C > struct imag : C::imag {};
namespace boost { namespace mpl {
template<>
struct plus_impl< complex_tag,complex_tag >
{
    template< typename N1, typename N2 > struct apply
        : complex<
              plus< typename N1::real, typename N2::real >
            , plus< typename N1::imag, typename N2::imag >
            >
    {
    };
};
}}
typedef complex< int_<5>, int_<-1> > c1;
typedef complex< int_<-5>, int_<1> > c2;
typedef plus<c1,c2> r1;
BOOST_MPL_ASSERT_RELATION( real<r1>::value, ==, 0 );
BOOST_MPL_ASSERT_RELATION( imag<r1>::value, ==, 0 );
typedef plus<c1,c1> r2;
BOOST_MPL_ASSERT_RELATION( real<r2>::value, ==, 10 );
BOOST_MPL_ASSERT_RELATION( imag<r2>::value, ==, -2 );
typedef plus<c2,c2> r3;
BOOST_MPL_ASSERT_RELATION( real<r3>::value, ==, -10 );
BOOST_MPL_ASSERT_RELATION( imag<r3>::value, ==, 2 );

Docutils System Messages

????????????????
Note: See TracBrowser for help on using the repository browser.