次の問題があるとします。
class Instrument {
};
class Guitar : public Instrument {
public:
void doGuitar() const;
};
class Piano : public Instrument {
public:
void doPiano() const;
};
へのポインタのリストを取得しましたInstrument
list<shared_ptr<Instrument>> instruments;
(たとえば)経由で楽器を追加する
Guitar myGuitar;
instruments.push_back(make_shared<Guitar>(myGuitar));
ここで、リストを反復処理して、現在の楽器がピアノで、ギターである場合にinstruments
呼び出します。これら 2 つの関数は大きく異なるため、 class で抽象化することはできません。doPiano()
doGuitar()
Instrument
問題は、C++ が Instrument
実行時に型を識別できないことですよね (単一ディスパッチのため)。イテレータが指している現在のタイプに応じて、ピアノまたはギター関数を呼び出すようにするにはどうすればよいですか。
sthを実装できたら嬉しいです。この疑似コードのように動作します:
list<shared_ptr<Instrument>>::const_iterator it;
if ("current type == Guitar")
(*it)->doGuitar();
else if ("current type == Piano")
(*it)->doPiano();
結果
実際、私は自分のアプローチでいくつかの問題に遭遇しました。この投稿を使用して多くのリファクタリングを行いました: How does one downcast a std::shared_ptr? . 助けてくれてありがとう:)