LINUX.ORG.RU

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

Исправление Siborgium, (текущая версия) :

Нет, variant вообще не замена ADT в смысле МЛ-подобных языков и не предназначался ей быть.

struct Animal { virtual void bark() = 0; }
struct AnotherDog: Animal { void bark() override { } };
struct Dog: Animal { void bark() override { } };

struct ArtificialBarker { void bark() { } };

constexpr auto bark(auto&& barkable) {
    return std::visit([](auto&& b) { b.bark(); }, barkable);
}

int main() {
    std::variant<Dog, AnotherDog, ArtificialBarker> variant = // ...
    bark(variant);
}

Простейший пример применения. При этом в visit можно использовать диспатч по типам как через if constexpr, так и перегрузкой, и для текущего значения будет выбран корректный вариант – но это уже больше к visit.

когда в руках молоток - всё вокруг похоже на гвоздь.

Где Zip?

Исправление Siborgium, :

Нет, variant вообще не замена ADT в смысле МЛ-подобных языков и не предназначался ей быть.

struct Animal { virtual void bark() = 0; }
struct AnotherDog: Animal { void bark() override { } };
struct Dog: Animal { void bark() override { } };

struct ArtificialBarker { void bark() { } };

constexpr auto bark(auto&& barkable) {
    return std::visit([](auto&& b) { b.bark(); }, barkable);
}

int main() {
    std::variant<Dog, AnotherDog, ArtificialBarker> variant = // ...
    bark(variant);
}

Простейший пример применения. При этом в visit можно использовать диспатч по типам как через if constexpr, так и перегрузкой, и для текущего значения будет выбран корректный вариант – но это уже больше к visit.

Исходная версия Siborgium, :

Нет, variant вообще не замена ADT в смысле МЛ-подобных языков и не предназначался ей быть.

struct Animal { virtual void bark() = 0; }
struct AnotherDog: Animal { void bark() override { } };
struct Dog: Animal { void bark() override { } };

struct ArtificialBarker { void bark() };

constexpr auto bark(auto&& barkable) {
    return std::visit([](auto&& b) { b.bark(); }, barkable);
}

int main() {
    std::variant<Dog, AnotherDog, ArtificialBarker> variant = // ...
    bark(variant);
}

Простейший пример применения. При этом в visit можно использовать диспатч по типам как через if constexpr, так и перегрузкой, и для текущего значения будет выбран корректный вариант – но это уже больше к visit.