Kilka wartości w std::optional

0

Dobry wieczór. Zwracam się do Was z pytaniem dotyczącym std::optional. Czy obiekt tej klasy może przechowywać kilka wartości (np. kilka różnych int)? Na to przynajmniej wskazuje dokumentacja std::make_optional. Czy jeśli obiekt std::optional przechowuje już jakąś wartość, mogę obok niej dodać inną?

3

Optional służy do przechowania 0 albo 1 elementu, jeśli chcesz przechowywać więcej wartości to możesz po prostu użyć std::vector :)

0

Czyli w takim wypadku musiałbym utworzyć std::optional<std::vector<JakiśTamTyp>>?

3

Po prostu std::vector<JakiśTamTyp>, bo vector może być przecież pusty. No chyba, że potrzebujesz odróżnić przypadki pustego vectora i jego całkowitego braku, wtedy możesz użyć swojej wersji.

1

Tak jak wyżej zostało już napisane, ale zadam pytanie pomocnicze: co dokładnie starasz się uzyskać?

1

std::optional może przechowywać dowolny typ. Jeżeli chcesz przechowywać więcej wartości w std::optional to możesz umieścić w nim strukturę, std::tuple lub kontener.

0

Dzięki wielkie za rady :) Trochę zmyliła mnie deklaracja std::make_optional.
@alagner - std::optional potrzebne mi było do implementacji grafu etykietowanego na macierzy sąsiedztwa. Póki co rozwiązałem to w ten sposób, że można mieć tylko jedną krawędź, która domyślnie jest zastępowana nową. "Na specjalne życzenie" można nie zezwolić na zastąpienie, wtedy nowa etykieta nie jest dodawana.

EDIT: Jest może jakiś sposób, by "przemycić" do std::value_or wartość, która definitywnie pozwoliłaby rozpoznać brak elementu? W tej chwili mam wartość domyślną typu, która np. w przypadku int może być myląca, gdy ktoś doda krawędź o etykiecie 0.

0

Jest może jakiś sposób, by "przemycić" do std::value_or wartość, która definitywnie pozwoliłaby rozpoznać brak elementu? W tej chwili mam wartość domyślną typu, która np. w przypadku int może być myląca, gdy ktoś doda krawędź o etykiecie 0.

Dlaczego nie chcesz skorzystać z metody has_value?

0
void process_optional(std::optional<int> x)
{
     if (x) { // if (x.has_value()) {
         std::cout << "Value is: " << *x << "\n';
     } else {
         std::cout <<  "No value\n";
     }
}

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