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ą?
Kilka wartości w std::optional
- Rejestracja: dni
- Ostatnio: dni
- Postów: 54
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Rzeszów
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 :)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 54
Czyli w takim wypadku musiałbym utworzyć std::optional<std::vector<JakiśTamTyp>>?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Rzeszów
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1493
Tak jak wyżej zostało już napisane, ale zadam pytanie pomocnicze: co dokładnie starasz się uzyskać?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 111
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 54
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 111
Jest może jakiś sposób, by "przemycić" do
std::optional::value_orwartość, która definitywnie pozwoliłaby rozpoznać brak elementu? W tej chwili mam wartość domyślną typu, która np. w przypadkuintmoże być myląca, gdy ktoś doda krawędź o etykiecie 0.
Dlaczego nie chcesz skorzystać z metody has_value?
- Rejestracja: dni
- Ostatnio: dni
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";
}
}