Код: Выделить всё
typedef void (*State)(Signal const&)
class StateMachine
{
public:
void exampleState(Signal const&);
private:
State m_currentState;
}
Код: Выделить всё
class Signal {};
class MySignal: public Signal {};
void StateMachine::exampleState(Signal const& signal){
if (typeid(signal) == typeid(MySignal)){
//code here
}
// other cases...
}
Другим решением было бы определить своего рода флаг типа, например перечисление, и передать соответствующий ему в производный конструктор сигналов
Код: Выделить всё
enum signalType{
mySignalType
//other types
}
class Signal {
public:
Signal(signalType sig_type):m_type(sig_type){};
const signalType m_type;
};
class MySignal: public Signal {
public:
MySignal():Signal(mySignalType){};
};
void StateMachine::exampleState(Signal const& signal){
switch (signal.m_type){
case mySignalType:
//code here
break;
// other cases...
}
}
Есть ли более элегантный способ добиться этого? Или, может быть, другая техника, которая вообще позволяет избежать этой проверки? Я помню, что эта проблема возникала и в других сценариях, поэтому вопрос в заголовке более общий, чем приведенный выше пример.
Подробнее здесь: https://stackoverflow.com/questions/490 ... at-runtime