Сообщение 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
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, либо никак.
Либо же договориться, что у твоего варианта один или несколько типов имеют сигнальные "пустые" значения.
Ну грубо говоря
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)