C++において実行時に型によって処理を分けたい場合はどうするか.
例えば Baseを継承したサブクラスのインスタンスをBaseのポインタで格納することはよくある.
class Figure {
public:
virtual void Draw()const = 0;
};
class Circle : public Figure {
...
public:
virtual void Draw()const override {
...
}
};
class Rect : public Figure{
...
public:
virtual void Draw()const override {
}
};
void main(){
std::vector<std::shared_ptr<Figure>> figures{};
figures.emplace_back(new Circle{}));
figures.emplace_back(new Rect{}));
//描画
for(const auto figure : figures){
//例えばCircleのみ描画させたい場合,型の判定が必要.
figure->Draw();
}
}
アプローチとしてはRTTIか,ベタにenumを持たせることになる.
・RTTI
RTTI(Run-Time Type Identification)実行時型識別.
C++ではOSによらず実行時に型の識別が可能.
dynamic_castを用いるか,type_infoを用いる2通りのやり方がある.
dynamic_castは,castに失敗するとnullptrが返ることを利用している.
for(const auto figure : figures){
//Circleのみ描画させたい場合
if(dynamic_cast<Circle*>(figure.get())){
figure->Draw();
}
}
#include <typeinfo>
...
for(const auto figure : figures){
//Circleのみ描画させたい場合
if(typeid(*figure) == typeid(Circle)){
figure->Draw();
}
}