Я пытаюсь манипулировать std::optional
, используя контейнер, например std::vector
.
Я начал с кода ниже:
#include <iostream>
#include <vector>
#include <string>
#include <optional>
using namespace std;
using optional_vecs = std::optional<std::vector<std::string>>;
optional_vecs returnStrings()
{
optional_vecs myVect(std::in_place);
myVect->emplace_back("Name");
return myVect;
}
int main()
{
for (auto e : returnStrings().value())
std::cout << e << " ";
return 0;
}
Проблема здесь в том, что я ничего не получаю на выходе: я предполагаю, что из-за того, что std::optional::value
возвращает ссылку, поскольку в моем случае это ссылка на временный объект.
Итак, чтобы решить эту проблему, я попытался использовать std::reference_wrapper
, как показано ниже:
using optional_vecs = std::optional<std::reference_wrapper<std::vector<std::string>>>;
optional_vecs returnStrings()
{
optional_vecs myVect;
myVect->get().emplace_back("Name");
return myVect;
}
Теперь у меня вылет и ошибка:
- сбой происходит при попытке добавить строку «имя».
- ошибка возникает, когда я пытаюсь использовать цикл
for-range
, говоряthe range for loop requires a suitable "begin" function and none was found.
Приведенный ниже код работает, но мне не нравится объявлять переменную, а затем вызывать Value ():
int main()
{
auto result = returnStrings();
for (auto e : result.value())
std::cout << e << " ";
return 0;
}
Итак, как я мог вернуть std :: optional, содержащий std::vector
в пути functionName().Value()
.