Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

This is the documentation for an old version of Boost. Click here to view this page for the latest version.
Front Page / Metafunctions / Miscellaneous / numeric_cast

numeric_cast

Synopsis

template< 
      typename SourceTag
    , typename TargetTag
    >
struct numeric_cast;

Description

Each numeric_cast specialization is a user-specialized unary Metafunction Class providing a conversion between two numeric types.

Header

#include <boost/mpl/numeric_cast.hpp>

Parameters

Parameter Requirement Description
SourceTag Integral Constant A tag for the conversion's source type.
TargetTag Integral Constant A tag for the conversion's destination type.

Expression semantics

If x and y are two numeric types, x is convertible to y, and x_tag and y_tag are the types' corresponding Integral Constant tags:

typedef apply_wrap2< numeric_cast<x_tag,y_tag>,x >::type  r;
Return type:A type.
Semantics:r is a value of x converted to the type of y.

Complexity

Unspecified.

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 numeric_cast< integral_c_tag,complex_tag >
{
    template< typename N > struct apply
        : complex< N, integral_c< typename N::value_type, 0 > >
    {
    };
};

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 int_<2> i;
typedef complex< int_<5>, int_<-1> > c1;
typedef complex< int_<-5>, int_<1> > c2;

typedef plus<c1,i> r4;
BOOST_MPL_ASSERT_RELATION( real<r4>::value, ==, 7 );
BOOST_MPL_ASSERT_RELATION( imag<r4>::value, ==, -1 );

typedef plus<i,c2> r5;
BOOST_MPL_ASSERT_RELATION( real<r5>::value, ==, -3 );
BOOST_MPL_ASSERT_RELATION( imag<r5>::value, ==, 1 );

See also

Metafunctions, Numeric Metafunction, plus, minus, times