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ą?
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
:)
Czyli w takim wypadku musiałbym utworzyć std::optional<std::vector<JakiśTamTyp>>
?
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.
Tak jak wyżej zostało już napisane, ale zadam pytanie pomocnicze: co dokładnie starasz się uzyskać?
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.
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.
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 przypadkuint
może być myląca, gdy ktoś doda krawędź o etykiecie 0.
Dlaczego nie chcesz skorzystać z metody has_value
?
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";
}
}