Информация об изменениях

Сообщение Re: как проверить std::variant empty от 20.12.2024 10:26

Изменено 20.12.2024 10:35 Кодт

Re: как проверить std::variant empty
Здравствуйте, sergey2b, Вы писали:

S>функция возращает std::variant варианты которого определенные мной классы

S>подскажите пожалуйста как проверить что функция вернула не пустое значение std::variant

Добавить пустой вариант std::monostate, причём желательно — первым в списке, чтобы дефолтный конструктор был с дефолтным же типом.

https://gcc.godbolt.org/z/YnWeqnoGj

#include <variant>
#include <iostream>

int main() {
    using V = std::variant<std::monostate, int, double>;
    V v;
    std::cout << "index = " << v.index() << std::endl;
    std::cout << "is monostate? " << std::boolalpha << std::holds_alternative<std::monostate>(v) << std::endl;
    v = 123.45;
    std::cout << "index = " << v.index() << std::endl;
    std::cout << "is monostate? " << std::boolalpha << std::holds_alternative<std::monostate>(v) << std::endl;
}
Re: как проверить std::variant empty
Здравствуйте, sergey2b, Вы писали:

S>функция возращает std::variant варианты которого определенные мной классы

S>подскажите пожалуйста как проверить что функция вернула не пустое значение std::variant

Добавить пустой вариант std::monostate, причём желательно — первым в списке, чтобы дефолтный конструктор был с дефолтным же типом.

Но если тип варианта приколочен гвоздями, — тогда либо заворачивать в std::optional, либо никак.

Либо же договориться, что у твоего варианта один или несколько типов имеют сигнальные "пустые" значения.
Ну грубо говоря
using V = std::variant<std::string, int>;

V v = get_v();

bool is_empty = std::get<0>(v).empty();
bool is_zero = !std::get<1>(v);

// или даже вот так
bool is_some_default = std::visit([](auto&& x) { using T = std::remove_cvref_t<decltype(x)>; return x == T{}; }, v)