回答編集履歴

5

ファイル名の入れ忘れ修正

2020/12/26 07:19

投稿

退会済みユーザー
test CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  ```c++
8
8
 
9
+ // Hearder.hpp
10
+
9
11
  #pragma once
10
12
 
11
13
 

4

クラスの特殊化よりメソッドの特殊化のほうが適していそうなので修正

2020/12/26 07:19

投稿

退会済みユーザー
test CHANGED
@@ -6,9 +6,137 @@
6
6
 
7
7
  ```c++
8
8
 
9
+ #pragma once
10
+
11
+
12
+
13
+ #include <iostream>
14
+
15
+ #include <vector>
16
+
17
+
18
+
19
+ struct Test
20
+
21
+ {
22
+
23
+ Test()
24
+
25
+ {
26
+
27
+ std::cout << "親クラスのTestのデフォルトコンストラクタ" << std::endl;
28
+
29
+ }
30
+
31
+
32
+
33
+ virtual void f()
34
+
35
+ {
36
+
37
+ std::cout << "親クラスのfメソッド" << std::endl;
38
+
39
+ }
40
+
41
+ };
42
+
43
+
44
+
45
+ template<class Type>
46
+
47
+ struct Sample:public Test
48
+
49
+ {
50
+
51
+ explicit Sample(const Type a)
52
+
53
+ {
54
+
55
+ std::cout << "子クラスのSample<type>のコンストラクタ" << std::endl;
56
+
57
+ }
58
+
59
+
60
+
61
+ void f()override
62
+
63
+ {
64
+
65
+ std::cout << "Sample<type>クラスでオーバーライドしたfメソッド" << std::endl;
66
+
67
+ }
68
+
69
+ };
70
+
71
+
72
+
73
+ template<> Sample<std::vector<int>>::Sample(const std::vector<int> a)
74
+
75
+ {
76
+
77
+ std::cout << "子クラスのSample<std::vector<int>>のコンストラクタ" << std::endl;
78
+
79
+ }
80
+
81
+
82
+
83
+ template<> void Sample<std::vector<int>>::f(){
84
+
85
+ std::cout << "Sample<std::vector<int>>クラスでオーバーライドしたfメソッド" << std::endl;
86
+
87
+ }
88
+
89
+ ```
90
+
91
+ ```c++
92
+
93
+ // main.cpp
94
+
95
+ #include "./Hearder.hpp"
96
+
97
+ #include <vector>
98
+
99
+
100
+
101
+ int main()
102
+
103
+ {
104
+
105
+ int int_v = 0;
106
+
107
+ auto vec_int_v = std::vector<int>();
108
+
109
+
110
+
111
+ auto s1 = Sample<int>(int_v);
112
+
113
+ auto s2 = Sample<std::vector<int>>(vec_int_v);
114
+
115
+
116
+
117
+ s1.f();
118
+
119
+ s2.f();
120
+
121
+ return 0;
122
+
123
+ }
124
+
125
+ ```
126
+
127
+ [wandboxで実行](https://wandbox.org/permlink/Lqqp705K29x8hdfY)
128
+
129
+
130
+
131
+ ちなみにc++17を使える環境なら
132
+
133
+ if constexprで特殊化の所を書かずにコードを簡略化可能です。
134
+
135
+ ```c++
136
+
9
137
  // Hearder.hpp
10
138
 
11
- #pragma once
139
+ #pragma once
12
140
 
13
141
 
14
142
 
@@ -16,6 +144,8 @@
16
144
 
17
145
  #include <vector>
18
146
 
147
+ #include <type_traits>
148
+
19
149
 
20
150
 
21
151
  struct Test
@@ -50,11 +180,15 @@
50
180
 
51
181
  {
52
182
 
53
- explicit Sample(const Type a)
183
+ explicit Sample(const Type& a)
54
-
184
+
55
- {
185
+ {
186
+
56
-
187
+ if constexpr(std::is_same_v<std::vector<int>, Type>)
188
+
189
+ std::cout << "子クラスのSample<std::vector<int>>のコンストラクタ" << std::endl;
190
+
57
- std::cout << "子クラスのSample<type>のコンストラクタ" << std::endl;
191
+ else std::cout << "子クラスのSample<type>のコンストラクタ" << std::endl;
58
192
 
59
193
  }
60
194
 
@@ -64,35 +198,11 @@
64
198
 
65
199
  {
66
200
 
67
- std::cout << "Sample<type>クラスでオーバーライドしたfメソッド" << std::endl;
68
-
69
- }
70
-
71
- };
72
-
73
-
74
-
75
- template<>
76
-
77
- struct Sample<std::vector<int>>:public Test
78
-
79
- {
80
-
81
- explicit Sample(const std::vector<int>& a)
201
+ if constexpr(std::is_same_v<std::vector<int>, Type>)
82
-
83
- {
202
+
84
-
85
- std::cout << "子クラスのSample<std::vector<int>>のコンストラクタ" << std::endl;
86
-
87
- }
88
-
89
-
90
-
91
- void f()override
92
-
93
- {
94
-
95
- std::cout << "Sample<std::vector<int>>クラスでオーバーライドしたfメソッド" << std::endl;
203
+ std::cout << "Sample<std::vector<int>>クラスでオーバーライドしたfメソッド" << std::endl;
204
+
205
+ else std::cout << "Sample<type>クラスでオーバーライドしたfメソッド" << std::endl;
96
206
 
97
207
  }
98
208
 
@@ -100,128 +210,6 @@
100
210
 
101
211
  ```
102
212
 
103
- ```c++
104
-
105
- // main.cpp
106
-
107
- #include "./Hearder.hpp"
108
-
109
- #include <vector>
110
-
111
-
112
-
113
- int main()
114
-
115
- {
116
-
117
- int int_v = 0;
118
-
119
- auto vec_int_v = std::vector<int>();
120
-
121
-
122
-
123
- auto s1 = Sample<int>(int_v);
124
-
125
- auto s2 = Sample<std::vector<int>>(vec_int_v);
126
-
127
-
128
-
129
- s1.f();
130
-
131
- s2.f();
132
-
133
- return 0;
134
-
135
- }
136
-
137
- ```
138
-
139
- [wandboxで実行](https://wandbox.org/permlink/if3GYMe6Masqyvyc)
140
-
141
-
142
-
143
- ちなみにc++17を使える環境なら
144
-
145
- if constexprで特殊化の所を書かずにコードを簡略化可能です。
146
-
147
- ```c++
148
-
149
- // Hearder.hpp
150
-
151
- #pragma once
152
-
153
-
154
-
155
- #include <iostream>
156
-
157
- #include <vector>
158
-
159
- #include <type_traits>
160
-
161
-
162
-
163
- struct Test
164
-
165
- {
166
-
167
- Test()
168
-
169
- {
170
-
171
- std::cout << "親クラスのTestのデフォルトコンストラクタ" << std::endl;
172
-
173
- }
174
-
175
-
176
-
177
- virtual void f()
178
-
179
- {
180
-
181
- std::cout << "親クラスのfメソッド" << std::endl;
182
-
183
- }
184
-
185
- };
186
-
187
-
188
-
189
- template<class Type>
190
-
191
- struct Sample:public Test
192
-
193
- {
194
-
195
- explicit Sample(const Type& a)
196
-
197
- {
198
-
199
- if constexpr(std::is_same_v<std::vector<int>, Type>)
200
-
201
- std::cout << "子クラスのSample<std::vector<int>>のコンストラクタ" << std::endl;
202
-
203
- else std::cout << "子クラスのSample<type>のコンストラクタ" << std::endl;
204
-
205
- }
206
-
207
-
208
-
209
- void f()override
210
-
211
- {
212
-
213
- if constexpr(std::is_same_v<std::vector<int>, Type>)
214
-
215
- std::cout << "Sample<std::vector<int>>クラスでオーバーライドしたfメソッド" << std::endl;
216
-
217
- else std::cout << "Sample<type>クラスでオーバーライドしたfメソッド" << std::endl;
218
-
219
- }
220
-
221
- };
222
-
223
- ```
224
-
225
213
 
226
214
 
227
215
  [wandboxで実行](https://wandbox.org/permlink/mj9XzYIO7erRrMc4)

3

typo修正3

2020/12/26 06:09

投稿

退会済みユーザー
test CHANGED
@@ -64,7 +64,7 @@
64
64
 
65
65
  {
66
66
 
67
- std::cout << "Sample<type>クラスでオーバーロードしたfメソッド" << std::endl;
67
+ std::cout << "Sample<type>クラスでオーバーライドしたfメソッド" << std::endl;
68
68
 
69
69
  }
70
70
 
@@ -212,7 +212,7 @@
212
212
 
213
213
  if constexpr(std::is_same_v<std::vector<int>, Type>)
214
214
 
215
- std::cout << "Sample<std::vector<int>>クラスでオーバーロードしたfメソッド" << std::endl;
215
+ std::cout << "Sample<std::vector<int>>クラスでオーバーライドしたfメソッド" << std::endl;
216
216
 
217
217
  else std::cout << "Sample<type>クラスでオーバーライドしたfメソッド" << std::endl;
218
218
 
@@ -224,4 +224,4 @@
224
224
 
225
225
 
226
226
 
227
- [wandboxで実行](https://wandbox.org/permlink/5Sz27iA6xopnX0uU)
227
+ [wandboxで実行](https://wandbox.org/permlink/mj9XzYIO7erRrMc4)

2

誤記修正2

2020/12/25 15:32

投稿

退会済みユーザー
test CHANGED
@@ -74,11 +74,9 @@
74
74
 
75
75
  template<>
76
76
 
77
- class Sample<std::vector<int>>:public Test
77
+ struct Sample<std::vector<int>>:public Test
78
-
78
+
79
- {
79
+ {
80
-
81
- public:
82
80
 
83
81
  explicit Sample(const std::vector<int>& a)
84
82
 
@@ -138,7 +136,7 @@
138
136
 
139
137
  ```
140
138
 
141
- [wandboxで実行](https://wandbox.org/permlink/mNy3CPP0YbyQKKIj)
139
+ [wandboxで実行](https://wandbox.org/permlink/if3GYMe6Masqyvyc)
142
140
 
143
141
 
144
142
 

1

typo修正

2020/12/25 15:16

投稿

退会済みユーザー
test CHANGED
@@ -94,7 +94,7 @@
94
94
 
95
95
  {
96
96
 
97
- std::cout << "Sample<std::vector<int>>クラスでオーバーロードしたfメソッド" << std::endl;
97
+ std::cout << "Sample<std::vector<int>>クラスでオーバーライドしたfメソッド" << std::endl;
98
98
 
99
99
  }
100
100
 
@@ -138,7 +138,7 @@
138
138
 
139
139
  ```
140
140
 
141
- [wandboxで実行](https://wandbox.org/permlink/QxThLTCOnzpt4Vaa)
141
+ [wandboxで実行](https://wandbox.org/permlink/mNy3CPP0YbyQKKIj)
142
142
 
143
143
 
144
144
 
@@ -216,7 +216,7 @@
216
216
 
217
217
  std::cout << "Sample<std::vector<int>>クラスでオーバーロードしたfメソッド" << std::endl;
218
218
 
219
- else std::cout << "Sample<type>クラスでオーバーロードしたfメソッド" << std::endl;
219
+ else std::cout << "Sample<type>クラスでオーバーライドしたfメソッド" << std::endl;
220
220
 
221
221
  }
222
222
 
@@ -226,4 +226,4 @@
226
226
 
227
227
 
228
228
 
229
- [wandboxで実行](https://wandbox.org/permlink/7mZ5pwfs3VGiu1jc)
229
+ [wandboxで実行](https://wandbox.org/permlink/5Sz27iA6xopnX0uU)