C++ Template Metaprogramming
Solutions to the exercises throughout the book
Loading...
Searching...
No Matches
c++20/exercise-2-1.hpp
Go to the documentation of this file.
1// ===-- chapter-2/c++20/exercise-2-1.hpp ----------------- -*- C++ -*- --=== //
9#ifndef EXERCISE_2_1
10#define EXERCISE_2_1
11
12#include <cstddef>
13#include <type_traits>
14
15
16namespace exercise_2_1 {
17
20inline namespace cpp20 {
21
36template <typename C, typename X, typename Y>
38{
39 // If we missed a case, this should give an error about no "type"
40};
41
55template <typename C, typename X, typename Y, bool Same>
57{
58 // Really a forward declaration. "Same" specifications are given below.
59};
60
62template <typename C, typename X, typename Y>
63struct replace_type<C*, X, Y>
64{
65 using type = std::add_pointer<
66 typename replace_type_dispatch<
67 C,
68 X,
69 Y,
70 std::is_same<C, X>::value
71 >::type
72 >::type;
73};
74
76template <typename C, typename X, typename Y>
77struct replace_type<C&, X, Y>
78{
79 using type = std::add_lvalue_reference<
80 typename replace_type_dispatch<
81 C,
82 X,
83 Y,
84 std::is_same<C, X>::value
85 >::type
86 >::type;
87};
88
90template <typename C, typename X, typename Y, size_t N>
91struct replace_type<C[N], X, Y>
92{
94 C,
95 X,
96 Y,
97 std::is_same<C, X>::value
98 >::type [N];
99};
100
102template <typename Cr, typename... CArgs, typename X, typename Y>
103struct replace_type<Cr(*)(CArgs...), X, Y>
104{
107 Cr,
108 X,
109 Y,
110 std::is_same<Cr, X>::value
111 >::type;
112
115 typename replace_type_dispatch<
116 CArgs,
117 X,
118 Y,
119 std::is_same<CArgs, X>::value
120 >::type...);
121
122 using type = func_type*;
123};
124
126template <typename C, typename X, typename Y>
127struct replace_type_dispatch<C, X, Y, true>
128{
129 using type = Y;
130};
132template <typename C, typename X, typename Y>
133struct replace_type_dispatch<C, X, Y, false>
134{
135 // Do not instantiate templates inside std::conditional by requesting
136 // ::type, because replace_type does not provide it (intentionally) in all
137 // situations.
138 using type = std::conditional<
139 std::is_arithmetic<C>::value,
140 std::type_identity<C>,
142 >::type::type;
143};
144
145} // inline namespace cpp20
146} // namespace exercise_2_1
147
148#endif // EXERCISE_2_1
Encapsulate solution for Exercise 2-1.
std::add_pointer< typename replace_type_dispatch< C, X, Y, std::is_same< C, X >::value >::type >::type type
std::add_lvalue_reference< typename replace_type_dispatch< C, X, Y, std::is_same< C, X >::value >::type >::type type
replace_type_dispatch< C, X, Y, std::is_same< C, X >::value >::type[N] type
ret_type(typename replace_type_dispatch< CArgs, X, Y, std::is_same< CArgs, X >::value >::type...) func_type
The signature of the replaced function.
replace_type_dispatch< Cr, X, Y, std::is_same< Cr, X >::value >::type ret_type
The return type of the "replaced" function.
std::conditional< std::is_arithmetic< C >::value, std::type_identity< C >, replace_type< C, X, Y > >::type::type type
Internal type used by replace_type.
Given an arbitrary compound type, replace nested types.