С++-эквивалент перечислений RustC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 С++-эквивалент перечислений Rust

Сообщение Anonymous »

Этот пример демонстрирует элегантный способ работы с сообщениями разных типов в Rust. Он имеет 4 варианта, а некоторые варианты имеют подчлены, которые доступны только в том случае, если перечисление относится к этому конкретному типу. Аналогичный шаблон возможен и в TypeScript.

Код: Выделить всё

enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
В C++ это, скорее всего, можно сравнить со следующим кодом.

Код: Выделить всё

struct Message
{
enum MessageType {QUIT, MOVE, WRITE, CHANGECOLOR} type;
union MessageContent
{
struct Move { int x; int y;} move;
std::string write;
std::tuple changeColor;
} content;
};
Однако этот способ не является типобезопасным, и управление памятью станет беспорядочным (например, проверка того, что строка освобождается, если Message уничтожается, если MessageType имеет значение ПИШИТЕ). Как лучше всего это сделать в современном C++?


Подробнее здесь: https://stackoverflow.com/questions/640 ... rust-enums
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»