2026-09-21
username.cpp
#include <optional>
#include <string>
#include <utility>
class Username {
public:
static std::optional<Username> create(std::string name) {
// write this: return std::nullopt if name is empty or longer than
// 16 characters; otherwise return a Username holding it.
}
const std::string &value() const { return name_; }
private:
explicit Username(std::string name) : name_(std::move(name)) {}
std::string name_;
};
Username::createを実装してください。コンストラクタはprivateなので、不変条件(空でなく16文字以下)を満たさないUsernameはここでしか作れません。
Reference
static std::optional<Username> create(std::string name) {
if (name.empty() || name.size() > 16) {
return std::nullopt;
}
return Username(std::move(name));
}
コンストラクタがprivateなので、Usernameを手に入れる唯一の経路はこのcreateだけです。つまり不変条件のチェックを1箇所に集約でき、いったんUsernameを手にした後のコードは「この値は必ず空でなく16文字以下である」ことを、そのたびに確認し直さずに前提にできます。Percentageの例(READ参照)のようにコンストラクタで例外を投げる代わりに、std::optionalで失敗を表すことで、呼び出し側は例外処理を書かずにifで結果を確認できます。これは参考実装であり、唯一の正解ではありません。