回答編集履歴

1

追記

2017/06/01 05:49

投稿

haru666
haru666

スコア1591

test CHANGED
@@ -177,3 +177,93 @@
177
177
 
178
178
 
179
179
  ちょっと動作確認まではしてないからあれだけどね。
180
+
181
+
182
+
183
+ #追記
184
+
185
+
186
+
187
+ 一応よりよい形はこんな感じかな
188
+
189
+ ```C++
190
+
191
+ struct Request
192
+
193
+ {
194
+
195
+ FooType Type;
196
+
197
+ vector<void*> Args;
198
+
199
+ }
200
+
201
+
202
+
203
+ int main()
204
+
205
+ {
206
+
207
+ // Fooのそれぞれの実装を登録する
208
+
209
+ std::map<FooType, Foo*> fooMap;
210
+
211
+ fooMap[FtA] = new Foo_A();
212
+
213
+ fooMap[FtB] = new Foo_B();
214
+
215
+
216
+
217
+ // リクエストはどのFooに何の引数を渡すかだけ知っている
218
+
219
+ Request arr[100]; // ※ちょっとこんな風に配列にできたか定かじゃないが…
220
+
221
+ for(int i=0;i < 100;i++)
222
+
223
+ {
224
+
225
+ //random()は乱数を呼ぶ関数
226
+
227
+ if(random()%2 == 1)
228
+
229
+ {
230
+
231
+ arr[i].Type = FtA;
232
+
233
+ }
234
+
235
+ else
236
+
237
+ {
238
+
239
+ arr[i].Type = FtB;
240
+
241
+ arr[i].Args.push_back(10);
242
+
243
+ }
244
+
245
+ }
246
+
247
+
248
+
249
+ // Requestの処理はFooの特定と渡された引数の移譲だけで良い
250
+
251
+ for(int i=0;i<100;i++)
252
+
253
+ {
254
+
255
+ // 好きなFooの実装は FooType と std::vector<void*> の組み合わせがあれば呼び出せる
256
+
257
+ fooMap[arr[i].Type]->calc(arr[i].args);
258
+
259
+ }
260
+
261
+
262
+
263
+ //メモリの解放は省略
264
+
265
+ }
266
+
267
+
268
+
269
+ ```