Argument Parser for Modern C++ | Fix Xmake and Modules
Go to file
Pranav Srinivas Kumar 4dc61b679e
Update README.md
2019-03-31 16:28:49 -04:00
src Implemented Argument::operator== and Argument::operator!= with specializations for std::vector and std::list 2019-03-31 16:27:18 -04:00
tests Implemented Argument::operator== and Argument::operator!= with specializations for std::vector and std::list 2019-03-31 16:27:18 -04:00
.gitignore Added visual studio gitignore 2019-03-30 16:59:57 -04:00
LICENSE Added LICENSE 2019-03-29 18:41:37 -04:00
README.md Update README.md 2019-03-31 16:28:49 -04:00

Argument Parser for Modern C++

Highlights

  • Simply include <argparse.hpp>
  • Requires C++17
  • MIT License

Examples

Positional Arguments

argparse::ArgumentParser program("main");

program.add_argument("input");
program.add_argument("output");

program.parse_args({"./main", "rocket.msh", "thrust_profile.csv"});

std::string input = program.get("input");     // "rocket.msh"
std::string output = program.get("output");   // "thrust_profile.csv"

Construct Objects from Arguments with .action

argparse::ArgumentParser program("json_test");

program.add_argument("config")
  .action([](const std::string& value) {
    // read a JSON file
    std::ifstream stream(value);
    nlohmann::json config_json;
    stream >> config_json;
    return config_json;
  });

program.parse_args({"./test", "config.json"});

nlohmann::json config = program.get<nlohmann::json>("config");

Optional Arguments

argparse::ArgumentParser program("main");

program.add_argument("--config")
  .help("configuration file")
  .default_value(std::string("config.json"));

program.add_argument("-n", "--num_iterations")
  .help("The list of input files")
  .action([](const std::string& value) { return std::stoi(value); });

program.parse_args({"./main", "-n", "36"});

std::string config = program.get("--config");   // "config.json"
int num_iterations = program.get<int>("-n");    // 36

Vector of Arguments

argparse::ArgumentParser program("main");

program.add_argument("--input_files")
  .help("The list of input files")
  .nargs(3);

program.parse_args({"./main", "--input_files", "config.yml", "System.xml"});

auto files = program.get<std::vector<std::string>>("--input_files");  // {"config.yml", "System.xml"}

Toggle Arguments

argparse::ArgumentParser program("test");

program.add_argument("--verbose", "-v")
  .default_value(false)
  .implicit_value(true);

program.parse_args({ "./main", "--verbose" });

if (program["--verbose'] == true) {   // true
    // enable verbose logging
}

Compound Arguments

argparse::ArgumentParser program("test");

program.add_argument("-a")
  .default_value(false)
  .implicit_value(true);

program.add_argument("-b")
  .default_value(false)
  .implicit_value(true);

program.add_argument("-c")
  .nargs(2)
  .action([](const std::string& value) { return std::stof(value); });

program.parse_args({ "./main", "-abc", "3.14", "2.718" });

auto a = program.get<bool>("-a");                // true
auto b = program.get<bool>("-b");                // true
auto c = program.get<std::vector<float>>("-c");  // {3.14f, 2.718f}

Positional Arguments with Compound Toggle Arguments

argparse::ArgumentParser program("test");

program.add_argument("numbers")
  .nargs(3)
  .action([](const std::string& value) { return std::stoi(value); });

program.add_argument("-a")
  .default_value(false)
  .implicit_value(true);

program.add_argument("-b")
  .default_value(false)
  .implicit_value(true);

program.add_argument("-c")
  .nargs(2)
  .action([](const std::string& value) { return std::stof(value); });

program.add_argument("--files")
  .nargs(3);

program.parse_args({ "./test.exe", "1", "-abc", "3.14", "2.718", "2", "--files",
  "a.txt", "b.txt", "c.txt", "3" });

auto numbers = program.get<std::vector<int>>("numbers");        // {1, 2, 3}
auto a = program.get<bool>("-a");                               // true
auto b = program.get<bool>("-b");                               // true
auto c = program.get<std::vector<float>>("-c");                 // {3.14f, 2.718f}
auto files = program.get<std::vector<std::string>>("--files");  // {"a.txt", "b.txt", "c.txt"}

Restricting the set of values for an argument

argparse::ArgumentParser program("test");

program.add_argument("input")
  .default_value("baz")
  .action([=](const std::string& value) {
    static const std::vector<std::string> choices = { "foo", "bar", "baz" };
    if (std::find(choices.begin(), choices.end(), value) != choices.end()) {
      return value;
    }
    return std::string{ "baz" };
  });

program.parse_args({ "./test", "fez" });

auto input = program.get("input"); // baz