Я не могу найти, где 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";
}

Итак, почему мы должны использовать опционально в целом и особенно в этом случае?

0 ответов

Другие вопросы по тегам