У меня есть класс токенов, который выглядит примерно так:
class Token
{
public:
typedef enum { STRTOK, INTTOK } Type;
virtual bool IsA(Type) = 0;
}
class IntTok : public Token
{
int data;
public:
bool IsA(Type t) { return (t == INTTOK); }
int GetData() { return data; }
}
IntTok newToken;
if ( newToken.IsA(Token::INTTOK )
{
//blah blah
}
Так что, по сути, я должен иметь каждый подкласс, определенный в классе Token; что не так уж плохо, потому что подклассов очень мало, и я не могу представить, как они меняются. Но, тем не менее, это уродливо, глупо и менее "правильно", чем идентификация подклассов с использованием динамического приведения. Тем не менее:
IntTok newToken;
IntTok* tmpTokenTest = dynamic_cast<IntTok*>(&newToken);
if ( tmpTokenTest != NULL )
{
//blah blah
}
Это тоже довольно глупо. Особенно, когда мне нужно связать их вместе в большое, вложенное, если.
Так что бы вы использовали? Есть ли другое решение этой проблемы?
Примечание: Я знаю, что мне все равно придется разыграть их, чтобы получить их соответствующие данные, но
- Я не буду кастовать их до тех пор, пока я не использую их функцию, так что она выглядит чище и
- Я проверяю их тип гораздо чаще, чем использую их данные.
Примечание 2: В приведенном выше коде не указано, что эти токены также являются связанным списком. Это затрудняет создание шаблонов (Token<int>
может указывать на Token<string>
и т. Д.). Вот почему для начала мне нужен родительский класс Token.