LINUX.ORG.RU

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

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

Исходная версия 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