История изменений
Исправление Siborgium, (текущая версия) :
Не зря я зашел в «показать скрытые». Отвечу на то, на что Роман, по моему мнению, ответил неполно.
Человек расстраививался из-за плохого матча, который, по его мнению
Что в такой реализации плохого? Я вижу 2 повода для расстройства
Цепочка if вместо лукапа по таблице
Потенциально долгая операция is.
Оба эти повода для расстройства нелепы, так как enum - это tagged union с целочисленным дискриминантом. Ну а то, как компилятор решит этот switch реализовать, цепочкой проверок ли, или лукапом, или даже двоичным поиском - это дело компилятора.
Боже, до тебя так и не дошло. Повторяю еще раз, мне глубоко наплевать, как там в итоге будет реализован диспатч, я семантику его сравниваю с семантикой ряда if’ов. Синтаксис, кстати, тоже практически аналогичен.
требует внедрения «клиентского» кода во все классы
Не требует. Если есть такое желание, можно написать для твоего Identifier
void print(const Identifier& x) {
std::visit(overloaded {
[](Id id) { print(std::to_string(id.value)); },
[](const Name& name) { print(name.name); },
[](const Uuid& uuid) { print(uuid.to_string()); }
}, x);
}
А можно добавить еще один обработчик [](auto && x){ print(x); }
, и бесплатно получить возможность добавлять новые типы в Identifier, добавляя их печать лишь если она для них не была реализована.
Через какое-то время даже до тебя дойдет, что портянка из обработчиков не скейлится, в отличие от добавления перегрузок/специализаций, но на это время и так сгодится.
Если мне надо рисовать эти шейпы в разных графических библиотеках
То ты не сможешь ничего сделать. Эти шейпы не примет никакая графическая библиотека, потому что она о них ничего не знает. Тебе придется делать что-то типа
use some::graphics::library::Drawable;
impl Drawable for Shape {
fn draw(shape: Self, ...) {
match shape {
// ...
}
}
}
По остальным пунктам я полностью солидарен с right_security.
Исходная версия Siborgium, :
Не зря я зашел в «показать скрытые». Отвечу на то, на что Роман, по моему мнению, ответил неполно.
Человек расстраививался из-за плохого матча, который, по его мнению
Что в такой реализации плохого? Я вижу 2 повода для расстройства
Цепочка if вместо лукапа по таблице
Потенциально долгая операция is.
Оба эти повода для расстройства нелепы, так как enum - это tagged union с целочисленным дискриминантом. Ну а то, как компилятор решит этот switch реализовать, цепочкой проверок ли, или лукапом, или даже двоичным поиском - это дело компилятора.
Боже, до тебя так и не дошло. Повторяю еще раз, мне глубоко наплевать, как там в итоге будет реализован диспатч, я семантику его сравниваю с семантикой ряда if’ов. Синтаксис, кстати, тоже практически аналогичен.
требует внедрения «клиентского» кода во все классы
Не требует. Если есть такое желание, можно написать для твоего Identifier
void print(const Identifier& x) {
std::visit(overloaded {
[](Id id) { print(std::to_string(id.value)); },
[](const Name& name) { print(name.name); },
[](const Uuid& uuid) { print(uuid.to_string()); }
}, x);
}
А можно добавить еще один обработчик [](auto && x){ print(x); }
, и бесплатно получить возможность добавлять новые типы в Identifier, добавляя их печать лишь если она для них не была реализована.
Через какое-то время даже до тебя дойдет, что портянка из обработчиков не скейлится, в отличие от добавления перегрузок/специализаций, но на это время и так сгодится.
Если мне надо рисовать эти шейпы в разных графических библиотеках
То ты не сможешь ничего сделать. Эти шейпы не примет никакая графическая библиотека, потому что она о них ничего не знает. Тебе придется делать что-то типа
use some::graphics::library::Drawable;
impl Drawable for Shape {
fn draw(shape: Self, ...) {
match shape {
// ...
}
}
}