История изменений
Исправление yoghurt, (текущая версия) :
В каком разрезе мы на это смотрим?=
Вот в этом:
yoghurt> чем же tagged union лучше variant-а с полноценным визитом?
Таки анроллить надо до конца
Да и вообще все фичи раста можно сделать в C++, ведь std::variant ничем не хуже tagged union с паттерн матчингом.
И вот в этом контексте вариант в плюсах вполне себе замена матчингу в умеющих в него языках, каких-то сверхспособностей второго так и не обнаружено.
А визитор кстати вполне полноценный, я даже приятно удивлен тем, что там не обязательно выписывать руками все теги, а можно делать заглушки по типу _ / otherwise - поигрался
#include <variant>
#include <iostream>
#include <string>
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
int main() {
using V = std::variant<int, double, std::string>;
V v1{"hello"}, v2{42}, v3{3.14};
auto visitor1 = overloaded {
[](const std::string& arg) { std::cout << arg << std::endl; },
[](auto) { std::cout << "<something else>" << std::endl; },
};
std::visit(visitor1, v1);
std::visit(visitor1, v2);
std::visit(visitor1, v3);
}
hello <something else> <something else>
Исходная версия yoghurt, :
В каком разрезе мы на это смотрим?=
Вот в этом:
yoghurt> чем же tagged union лучше variant-а с полноценным визитом?
Таки анроллить надо до конца
Да и вообще все фичи раста можно сделать в C++, ведь std::variant ничем не хуже tagged union с паттерн матчингом.
И вот в этом контексте вариант в плюсах вполне себе замена матчингу в умеющих в него языках, каких-то сверхспособностей второго так и не обнаружено.
А визитор кстати вполне полноценный, я даже приятно удивлен тем, что там не обязательно выписывать руками все теги, а можно делать заглушки по типу _ / otherwise - поигрался
#include <variant>
#include <iostream>
#include <string>
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
int main() {
using V = std::variant<int, double, std::string>;
V v1{"hello"}, v2{42}, v3{3.14};
auto visitor1 = overloaded {
[](const std::string& arg) { std::cout << arg << std::endl; },
[](auto) { std::cout << "<something else>" << std::endl; },
};
std::visit(visitor1, v1);
std::visit(visitor1, v2);
std::visit(visitor1, v3);
}
hello <something else> <something else> [/
https://wandbox.org/permlink/1ubzWL7CZuGjF6Cf