teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

文章を修正してCodeを追加しました。

2020/08/31 05:55

投稿

Y.R.T
Y.R.T

スコア42

title CHANGED
File without changes
body CHANGED
@@ -4,4 +4,218 @@
4
4
 
5
5
  kernel32.dll![下のフレームは間違っているか、または見つかりません。kernel32.dll に対して読み込まれたシンボルはありません]
6
6
 
7
- このメッセセージが出てデバックが出来ないです。
7
+ このメッセセージが出てデバックが出来ないです。
8
+
9
+ <修正>
10
+ すみません、ステップインデバックはできるようです。
11
+ しかし、上記メッセージは何でしょうか?
12
+ 実際に実行しても何も実行結果が表示さずに終了して
13
+ しまいます。
14
+
15
+ ```
16
+ #include <cmath>
17
+ #include <assert.h>
18
+
19
+ bool are_equal(double const d1, double const d2, double const epsilon = 0.001)
20
+ {
21
+ return std::fabs(d1 - d2) < epsilon;
22
+ }
23
+
24
+ namespace temperature
25
+ {
26
+ enum class scale
27
+ {
28
+ celsius,
29
+ fahrenheit,
30
+ kelvin
31
+ };
32
+
33
+ template <scale S>
34
+ class quantity
35
+ {
36
+ const double amount;
37
+ public:
38
+ constexpr explicit quantity(double const a) : amount(a) {}
39
+
40
+ explicit operator double() const { return amount; }
41
+ };
42
+
43
+ template <scale S>
44
+ inline bool operator==(quantity<S> const& lhs, quantity<S> const& rhs)
45
+ {
46
+ return are_equal(static_cast<double>(lhs), static_cast<double>(rhs));
47
+ }
48
+
49
+ template <scale S>
50
+ inline bool operator!=(quantity<S> const& lhs, quantity<S> const& rhs)
51
+ {
52
+ return !(lhs == rhs);
53
+ }
54
+
55
+ template <scale S>
56
+ inline bool operator< (quantity<S> const& lhs, quantity<S> const& rhs)
57
+ {
58
+ return static_cast<double>(lhs) < static_cast<double>(rhs);
59
+ }
60
+
61
+ template <scale S>
62
+ inline bool operator> (quantity<S> const& lhs, quantity<S> const& rhs)
63
+ {
64
+ return rhs < lhs;
65
+ }
66
+
67
+ template <scale S>
68
+ inline bool operator<=(quantity<S> const& lhs, quantity<S> const& rhs)
69
+ {
70
+ return !(lhs > rhs);
71
+ }
72
+
73
+ template <scale S>
74
+ inline bool operator>=(quantity<S> const& lhs, quantity<S> const& rhs)
75
+ {
76
+ return !(lhs < rhs);
77
+ }
78
+
79
+ template <scale S>
80
+ constexpr quantity<S> operator+(quantity<S> const& q1, quantity<S> const& q2)
81
+ {
82
+ return quantity<S>(static_cast<double>(q1) + static_cast<double>(q2));
83
+ }
84
+
85
+ template <scale S>
86
+ constexpr quantity<S> operator-(quantity<S> const& q1, quantity<S> const& q2)
87
+ {
88
+ return quantity<S>(static_cast<double>(q1) - static_cast<double>(q2));
89
+ }
90
+
91
+ template <scale S, scale R>
92
+ struct conversion_traits
93
+ {
94
+ static double convert(double const value) = delete;
95
+ };
96
+
97
+ template <>
98
+ struct conversion_traits<scale::celsius, scale::kelvin>
99
+ {
100
+ static double convert(double const value)
101
+ {
102
+ return value + 273.15;
103
+ }
104
+ };
105
+
106
+ template <>
107
+ struct conversion_traits<scale::kelvin, scale::celsius>
108
+ {
109
+ static double convert(double const value)
110
+ {
111
+ return value - 273.15;
112
+ }
113
+ };
114
+
115
+ template <>
116
+ struct conversion_traits<scale::celsius, scale::fahrenheit>
117
+ {
118
+ static double convert(double const value)
119
+ {
120
+ return (value * 9) / 5 + 32;;
121
+ }
122
+ };
123
+
124
+ template <>
125
+ struct conversion_traits<scale::fahrenheit, scale::celsius>
126
+ {
127
+ static double convert(double const value)
128
+ {
129
+ return (value - 32) * 5 / 9;
130
+ }
131
+ };
132
+
133
+ template <>
134
+ struct conversion_traits<scale::fahrenheit, scale::kelvin>
135
+ {
136
+ static double convert(double const value)
137
+ {
138
+ return (value + 459.67) * 5 / 9;
139
+ }
140
+ };
141
+
142
+ template <>
143
+ struct conversion_traits<scale::kelvin, scale::fahrenheit>
144
+ {
145
+ static double convert(double const value)
146
+ {
147
+ return (value * 9) / 5 - 459.67;
148
+ }
149
+ };
150
+
151
+ template <scale R, scale S>
152
+ constexpr quantity<R> temperature_cast(quantity<S> const q)
153
+ {
154
+ return quantity<R>(conversion_traits<S, R>::convert(static_cast<double>(q)));
155
+ }
156
+
157
+ namespace temperature_scale_literals
158
+ {
159
+ constexpr quantity<scale::celsius> operator "" _deg(long double const amount)
160
+ {
161
+ return quantity<scale::celsius> {static_cast<double>(amount)};
162
+ }
163
+
164
+ constexpr quantity<scale::fahrenheit> operator "" _f(long double const amount)
165
+ {
166
+ return quantity<scale::fahrenheit> {static_cast<double>(amount)};
167
+ }
168
+
169
+ constexpr quantity<scale::kelvin> operator "" _k(long double const amount)
170
+ {
171
+ return quantity<scale::kelvin> {static_cast<double>(amount)};
172
+ }
173
+ }
174
+ }
175
+
176
+ int main()
177
+ {
178
+ using namespace temperature;
179
+ using namespace temperature_scale_literals;
180
+
181
+ auto t1{ 36.5_deg };
182
+ auto t2{ 79.0_f };
183
+ auto t3{ 100.0_k };
184
+
185
+ {
186
+ auto tf = temperature_cast<scale::fahrenheit>(t1);
187
+ auto tc = temperature_cast<scale::celsius>(tf);
188
+ assert(t1 == tc);
189
+ }
190
+
191
+ {
192
+ auto tk = temperature_cast<scale::kelvin>(t1);
193
+ auto tc = temperature_cast<scale::celsius>(tk);
194
+ assert(t1 == tc);
195
+ }
196
+
197
+ {
198
+ auto tc = temperature_cast<scale::celsius>(t2);
199
+ auto tf = temperature_cast<scale::fahrenheit>(tc);
200
+ assert(t2 == tf);
201
+ }
202
+
203
+ {
204
+ auto tk = temperature_cast<scale::kelvin>(t2);
205
+ auto tf = temperature_cast<scale::fahrenheit>(tk);
206
+ assert(t2 == tf);
207
+ }
208
+
209
+ {
210
+ auto tc = temperature_cast<scale::celsius>(t3);
211
+ auto tk = temperature_cast<scale::kelvin>(tc);
212
+ assert(t3 == tk);
213
+ }
214
+
215
+ {
216
+ auto tf = temperature_cast<scale::fahrenheit>(t3);
217
+ auto tk = temperature_cast<scale::kelvin>(tf);
218
+ assert(t3 == tk);
219
+ }
220
+ }
221
+ ```