#ifndef ARGS_HH #define ARGS_HH #include #include #include #include #include class Option { public: virtual ~Option() = default; virtual bool is_set() const = 0; protected: Option() = default; Option(Option const&) = delete; Option& operator=(Option const&) = delete; }; class OptionWithArg : public Option { public: virtual std::string const& arg() const = 0; }; class Args { public: virtual ~Args() = default; static std::unique_ptr create(); virtual std::shared_ptr