Odczytywanie informacji z variant

0

Załóżmy, że mam taki wektor:

std::vector<std::variant<std::string, char, bool, int, float, double> > variantVector;

do którego dodaję, a następnie odczytuję dane:

variantVector[0].emplace<int>(12345);
variantVector[0].emplace<std::string>("text");

std::cout << std::get<std::string>(variantVector[0]);

W tym wypadku wyświetlony zostaje "text". Gdybym "dodał" do variantVector[0] najpierw std::string, a później int, wyrzucony zostanie błąd. W jaki sposób mogę odczytać wszystkie wartości zmiennych w variantVector[0], a nie tylko tą ostatnią?

Mam też pytanie dotyczące typów w std::variant - czy można stworzyć taki variant, który zaakceptuje każdy typ, nieuwzględniony wcześniej w definicji (na zasadzie auto lub std::any)?

2

variant to unia z tagiem. Główną charakterystyką unii/variantu jest właśnie to, że trzyma jeden z elementów na raz.

Może to słaba analogia, ale pomyśl o variancie jak o toalecie. Na raz do środka wchodzi jedna osoba. Jak wchodzi nowa, to stara jest usuwana, więc kiedykolwiek sprawdzisz, będzie tam tylko ostatnia osoba która weszła.

0

@kq: Jakie zastosowanie ma w takim razie index()? I co się dzieje ze "starą" wartością?

1

Informuje która jest obecnie w użyciu. Jest usuwana.

0

Rozumiem. Czy w takim razie variant może przyjmować każdy typ (drugie pytanie)? Czy liczba indeksów musi być znana przy definicji variantu?

1

variant może przyjąć każdy typ jaki został zdefiniowany dla danego variantu. Definicja musi być znana w czasie kompilacji. Trick answer może dorzucić std::any, które przyjmuje dowolny typ.

0

Kod z std::vector< variant<any> > się nie kompiluje - występują takie błędy jak std::variant<std::any>::emplace': no matching overloaded function found i takie, informujące, że nie można porównywać takich variantów (x.vectorVariant == y.vectorVariant).

1

Może lepiej opisz co chcesz zrobić, bo w tej chwili rzucasz się bezmyślnie na każde hasło jakie usłyszysz.
Sama kombinacja variant<any> dowodzi, że nie masz pojęcia co chcesz zrobić.

0

Chciałbym, żeby variant przyjmował np. każdy typ is_integral.

1

a nie prościej po prostu posługiwać się najbardziej pojemnym typem całkowitym?
Czemu się upierasz przy variant? Co chcesz tym zyskać?
Najlepiej opisz problem który próbujesz rozwiązać za pomocą variant!

Wygląda na to, że źle zadajesz pytanie. Takie zadawanie pytania jest to opisane jako problem XY.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0