]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/mpl/doc/src/refmanual/numeric_cast.rst
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / mpl / doc / src / refmanual / numeric_cast.rst
1 .. Metafunctions/Miscellaneous//numeric_cast |50
2
3 numeric_cast
4 ============
5
6 Synopsis
7 --------
8
9 .. parsed-literal::
10
11 template<
12 typename SourceTag
13 , typename TargetTag
14 >
15 struct numeric_cast;
16
17
18 Description
19 -----------
20
21 Each ``numeric_cast`` specialization is a user-specialized unary |Metafunction Class|
22 providing a conversion between two numeric types.
23
24
25 Header
26 ------
27
28 .. parsed-literal::
29
30 #include <boost/mpl/numeric_cast.hpp>
31
32
33 Parameters
34 ----------
35
36 +---------------+---------------------------+-----------------------------------------------+
37 | Parameter | Requirement | Description |
38 +===============+===========================+===============================================+
39 | ``SourceTag`` | |Integral Constant| | A tag for the conversion's source type. |
40 +---------------+---------------------------+-----------------------------------------------+
41 | ``TargetTag`` | |Integral Constant| | A tag for the conversion's destination type. |
42 +---------------+---------------------------+-----------------------------------------------+
43
44
45 Expression semantics
46 --------------------
47
48 If ``x`` and ``y`` are two numeric types, ``x`` is convertible to ``y``, and
49 ``x_tag`` and ``y_tag`` are the types' corresponding |Integral Constant| tags:
50
51
52 .. parsed-literal::
53
54 typedef apply_wrap\ ``2``\< numeric_cast<x_tag,y_tag>,x >::type r;
55
56 :Return type:
57 A type.
58
59 :Semantics:
60 ``r`` is a value of ``x`` converted to the type of ``y``.
61
62
63 Complexity
64 ----------
65
66 Unspecified.
67
68
69 Example
70 -------
71
72 .. parsed-literal::
73
74 struct complex_tag : int_<10> {};
75
76 template< typename Re, typename Im > struct complex
77 {
78 typedef complex_tag tag;
79 typedef complex type;
80 typedef Re real;
81 typedef Im imag;
82 };
83
84 template< typename C > struct real : C::real {};
85 template< typename C > struct imag : C::imag {};
86
87 namespace boost { namespace mpl {
88
89 template<> struct numeric_cast< integral_c_tag,complex_tag >
90 {
91 template< typename N > struct apply
92 : complex< N, integral_c< typename N::value_type, 0 > >
93 {
94 };
95 };
96
97 template<>
98 struct plus_impl< complex_tag,complex_tag >
99 {
100 template< typename N1, typename N2 > struct apply
101 : complex<
102 plus< typename N1::real, typename N2::real >
103 , plus< typename N1::imag, typename N2::imag >
104 >
105 {
106 };
107 };
108
109 }}
110
111 typedef int_<2> i;
112 typedef complex< int_<5>, int_<-1> > c1;
113 typedef complex< int_<-5>, int_<1> > c2;
114
115 typedef plus<c1,i> r4;
116 BOOST_MPL_ASSERT_RELATION( real<r4>::value, ==, 7 );
117 BOOST_MPL_ASSERT_RELATION( imag<r4>::value, ==, -1 );
118
119 typedef plus<i,c2> r5;
120 BOOST_MPL_ASSERT_RELATION( real<r5>::value, ==, -3 );
121 BOOST_MPL_ASSERT_RELATION( imag<r5>::value, ==, 1 );
122
123
124 See also
125 --------
126
127 |Metafunctions|, |Numeric Metafunction|, |plus|, |minus|, |times|
128
129
130 .. copyright:: Copyright © 2001-2009 Aleksey Gurtovoy and David Abrahams
131 Distributed under the Boost Software License, Version 1.0. (See accompanying
132 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)