blob: 44985723b80551fe0d536c06c253a5039c33ffd9 [file] [log] [blame]
.. Metafunctions/Concepts//Numeric Metafunction |60
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. |
+-------------------------------------------+-----------------------+---------------------------+
| .. parsed-literal:: | Any type | Unspecified. |
| | | |
| op_impl< | | |
| op_tag<x>::type | | |
| , op_tag<y>::type | | |
| >::apply<x,y>::type | | |
+-------------------------------------------+-----------------------+---------------------------+
|``op<``\ |x1...xn|\ ``>::type`` | Any type | Unspecified. |
+-------------------------------------------+-----------------------+---------------------------+
Expression semantics
--------------------
.. parsed-literal::
typedef op_tag<x>::type tag;
:Semantics:
``tag`` is a tag type for ``x`` for ``op``.
``tag::value`` is ``x``\ 's *conversion rank*.
.. ..........................................................................
.. parsed-literal::
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``.
.. ..........................................................................
.. parsed-literal::
typedef op<\ |x1...xn|\ >::type r;
:Semantics:
``r`` is the result of ``op`` application on arguments |x1...xn|.
Example
-------
.. parsed-literal::
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 );
Models
------
* |plus|
* |minus|
* |times|
* |divides|
See also
--------
|Tag Dispatched Metafunction|, |Metafunctions|, |numeric_cast|
.. copyright:: Copyright © 2001-2009 Aleksey Gurtovoy and David Abrahams
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)