История изменений
Исправление 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.