Все экземпляры структуры или класса имеют одинаковую структуру. К счастью, есть некоторые приемы, которые можно использовать для «симуляции» того, что вы пытаетесь сделать.
Первый прием (который также может быть использован в C) - это использование объединения, например ::100100
struct MyStruct
{
int field1;
char field2;
int type;
union
{
int field3a;
char field3b;
double field3c;
} field3;
};
В объединении все члены занимают одно и то же место в памяти. Как программист, вы должны быть осторожны. Вы можете получить из объединения только то, что вставили. Если вы инициализируете одного члена объединения, но читаете другого члена, вы, вероятно, получите мусор (если вы не хотите делать некоторые низкоуровневые хаки, но не делайте этого). это если вы не очень опытный).
Профсоюзы часто объединяются с другим полем (вне союза), которое указывает, какой член фактически используется в профсоюзе. Вы можете считать это вашим «состоянием».
Второй трюк - использование шаблона 'state' (см. http://en.wikipedia.org/wiki/State_pattern).. Из внешнего мира класс контекста выглядит всегда одинаково, но внутри разные состояния могут содержать информацию разного рода.
Несколько упрощенный подход к состоянию - использовать простое наследование и использовать динамическое приведение типов. В зависимости от вашего «условия» используйте другой подкласс и выполните динамическое приведение, чтобы получить конкретную информацию.
Например, предположим, что у нас есть класс Country. В некоторых странах есть президент, в других - король, в других - император. Вы могли бы что-то вроде этого:
class Country
{
...
};
class Republic : public Country
{
public:
const string &getPresident() const;
const string &getVicePresident() const;
};
class Monarchy : public Country
{
public:
const string &getKing() const;
const string &getQueen() const;
};
В вашем приложении вы можете работать с указателями на страну и выполнять динамическое приведение к республике или монархии, где нужен президент или король.
Этот пример может быть легко преобразован в пример с использованием паттерна «состояние», но я оставляю это как упражнение для вас.
Лично я бы пошел на государственную схему. Я не большой поклонник динамических бросков, и они всегда кажутся мне хакерами.