Open the-moisrex opened 4 months ago
From P2996R4 and its second implementation:
template<typename Opts> auto parse_options(std::span<std::string_view const> args) -> Opts { Opts opts; template for (constexpr auto dm : nonstatic_data_members_of(^Opts)) { auto it = std::ranges::find_if(args, [](std::string_view arg){ return arg.starts_with("--") && arg.substr(2) == name_of(dm); }); if (it == args.end()) { // no option provided, use default continue; } else if (it + 1 == args.end()) { std::print(stderr, "Option {} is missing a value\n", *it); std::exit(EXIT_FAILURE); } using T = typename[:type_of(dm):]; auto iss = std::ispanstream(it[1]); if (iss >> opts.[:dm:]; !iss) { std::print(stderr, "Failed to parse option {} into a {}\n", *it, display_name_of(^T)); std::exit(EXIT_FAILURE); } } return opts; } struct MyOpts { std::string file_name = "input.txt"; // Option "--file_name <string>" int count = 1; // Option "--count <int>" }; int main(int argc, char *argv[]) { MyOpts opts = parse_options<MyOpts>(std::vector<std::string_view>(argv+1, argv+argc)); // ... }
This idea seems really cool for the users to have.
From P2996R4 and its second implementation:
This idea seems really cool for the users to have.