Я не могу найти, где std:: опция полезна
Я нашел код выше в этой ссылке, и он говорит, что этот пример, где std::option отлично подходит!
class UserRecord
{
public:
UserRecord(const std::string& name, std::optional<std::string> nick, std::optional<int> age)
: mName{ name }, mNick{ nick }, mAge{ age }
{
}
friend std::ostream& operator << (std::ostream& stream, const UserRecord& user);
private:
std::string mName;
std::optional<std::string> mNick;
std::optional<int> mAge;
};
std::ostream& operator << (std::ostream& os, const UserRecord& user)
{
os << user.mName << ' ';
if (user.mNick) {
os << *user.mNick << ' ';
}
if (user.mAge)
os << "age of " << *user.mAge;
return os;
}
int main()
{
UserRecord tim{ "Tim", "SuperTim", 16 };
UserRecord nano{ "Nathan", std::nullopt, std::nullopt };
std::cout << tim << "\n";
std::cout << nano << "\n";
}
Я создал еще один без дополнительного, который находится ниже, и я считаю, что это проще, чем тот, который использует std::option
,
Я думаю, что вторая версия более читабельна, потому что нет необходимости использовать std::nullopt
class UserRecord
{
public:
UserRecord(const std::string& name, std::string nick = "", int age = 0)
: mName{ name }, mNick{ nick }, mAge{ age }
{
}
friend std::ostream& operator << (std::ostream& stream, const UserRecord& user);
private:
std::string mName;
std::string mNick;
int mAge;
};
std::ostream& operator << (std::ostream& os, const UserRecord& user)
{
os << user.mName << ' ';
if (user.mNick != "") {
os << user.mNick << ' ';
}
if (user.mAge != 0)
os << "age of " << user.mAge;
return os;
}
int main()
{
UserRecord tim{ "Tim", "SuperTim", 16 };
UserRecord nano{ "Nathan" };
std::cout << tim << "\n";
std::cout << nano << "\n";
}
Итак, почему мы должны использовать опционально в целом и особенно в этом случае?