C++ Template Metaprogramming
Solutions to the exercises throughout the book
Loading...
Searching...
No Matches
exercise-2-1.hpp
Go to the documentation of this file.
1// ===-- chapter-2/exercise-2-1.hpp ----------------------- -*- C++ -*- --=== //
9#ifndef EXERCISE_2_1
10#define EXERCISE_2_1
11
12#include <boost/type_traits/add_pointer.hpp>
13#include <boost/type_traits/add_reference.hpp>
14
15#include <boost/type_traits/is_same.hpp>
16
17
44namespace exercise_2_1 {
45
60template <typename C, typename X, typename Y>
62{
63 // If we missed a case, this should give an error about no "type"
64};
65
79template <typename C, typename X, typename Y, bool Same>
81{
82 // Really a forward declaration. "Same" specifications are given below.
83};
84
86template <typename C, typename X, typename Y>
87struct replace_type<C*, X, Y>
88{
89 typedef
90 typename boost::add_pointer<
91 typename replace_type_dispatch<
92 C,
93 X,
94 Y,
95 boost::is_same<C, X>::value
96 >::type
97 >::type
99};
100
102template <typename C, typename X, typename Y>
103struct replace_type<C&, X, Y>
104{
105 typedef
106 typename boost::add_reference<
107 typename replace_type_dispatch<
108 C,
109 X,
110 Y,
111 boost::is_same<C, X>::value
112 >::type
113 >::type
115};
116
118template <typename C, typename X, typename Y, size_t N>
119struct replace_type<C[N], X, Y>
120{
121 typedef
122 typename replace_type_dispatch<
123 C,
124 X,
125 Y,
126 boost::is_same<C, X>::value
127 >::type
128 type [N];
129};
130
132// Going to get tedious for multiple arguments... Could variadic templates help
133// here?
134template <typename Cr, typename X, typename Y>
135struct replace_type<Cr(*)(), X, Y>
136{
137 typedef
138 typename replace_type_dispatch<
139 Cr,
140 X,
141 Y,
142 boost::is_same<Cr, X>::value
143 >::type
144 (*type)();
145};
147template <typename Cr, typename C0, typename X, typename Y>
148struct replace_type<Cr(*)(C0), X, Y>
149{
150 typedef
151 typename replace_type_dispatch<
152 Cr,
153 X,
154 Y,
155 boost::is_same<Cr, X>::value
156 >::type
157 (*type)(
158 typename replace_type_dispatch<
159 C0,
160 X,
161 Y,
162 boost::is_same<C0, X>::value
163 >::type
164 );
165};
167template <typename Cr, typename C0, typename C1, typename X, typename Y>
168struct replace_type<Cr(*)(C0,C1), X, Y>
169{
170 typedef
171 typename replace_type_dispatch<
172 Cr,
173 X,
174 Y,
175 boost::is_same<Cr, X>::value
176 >::type
177 (*type)(
178 typename replace_type_dispatch<
179 C0,
180 X,
181 Y,
182 boost::is_same<C0, X>::value
183 >::type,
184 typename replace_type_dispatch<
185 C1,
186 X,
187 Y,
188 boost::is_same<C1, X>::value
189 >::type
190 );
191};
192
194template <typename C, typename X, typename Y>
195struct replace_type_dispatch<C, X, Y, true>
196{
197 typedef Y type;
198};
200template <typename C, typename X, typename Y>
201struct replace_type_dispatch<C, X, Y, false>
202{
204};
205
206} // namespace exercise_2_1
207
208#endif // EXERCISE_2_1
Encapsulate solution for Exercise 2-1.
boost::add_pointer< typenamereplace_type_dispatch< C, X, Y, boost::is_same< C, X >::value >::type >::type type
boost::add_reference< typenamereplace_type_dispatch< C, X, Y, boost::is_same< C, X >::value >::type >::type type
Internal type used by replace_type.
Given an arbitrary compound type, replace nested types.