Kilka wartości w std::optional

Kilka wartości w std::optional
NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 54
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ą?

mad_penguin
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Rzeszów
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 :)

NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 54
0

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

mad_penguin
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Rzeszów
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.

AL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1493
1

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

Pebal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 111
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.

NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 54
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::optional::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.

Pebal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 111
0

Jest może jakiś sposób, by "przemycić" do std::optional::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?

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
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";
     }
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.