Я пытаюсь использовать boost::optional
, как показано ниже.
#include <iostream>
#include <string>
#include <boost/optional.hpp>
struct myClass
{
int myInt;
void setInt(int input) { myInt = input; }
int getInt(){return myInt; }
};
boost::optional<myClass> func(const std::string &str)
{
boost::optional<myClass> value;
if(str.length() > 5)
{
// If greater than 5 length string. Set value to 10
value.get().setInt(10);
}
else if (str.length() < 5)
{
// Else set it to 0
value.get().setInt(0);
}
else
{
// If it is 5 set the value to 5
value.get().setInt(5);
}
return value;
}
int main()
{
boost::optional<myClass> v1 = func("3124");
boost::optional<myClass> v2 = func("helloWorld");
boost::optional<myClass> v3 = func("hello");
if (v1)
std::cout << "v1 is valid" << std::endl;
else
std::cout << "v1 is not valid" << std::endl;
if (v2)
std::cout << "v2 is valid" << std::endl;
else
std::cout << "v3 is not valid" << std::endl;
if (v3)
std::cout << "v3 is valid" << std::endl;
else
std::cout << "v3 is not valid" << std::endl;
return 0;
}
Я получаю следующую ошибку
prog.exe: /usr/local/boost -1.55.0/include/boost/optional/optional.hpp:631: boost:: optional:: reference_type boost:: optional:: get() [с T = мои занятия; boost:: optional:: reference_type = myClass &]: Утверждение `this- > is_initialized() 'не удалось.
Предположительно, необязательная переменная не инициализируется должным образом. Как это сделать правильно?
EDIT:: Получили очень хорошие ответы, всего пару вопросов 1. Является ли хорошей идеей использовать make_optional
в конце функции 'func'
и вернуть его? Также 2. Я думал о назначении boost::none
, чтобы подчеркнуть, что у меня нет никакой ценности для назначения и почему boost::none
. Но не уверен, что это действительно так?