LINUX.ORG.RU

История изменений

Исправление 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 {
            // ...
        }
    }
}