CLI11 2.7.1
C++11 Command Line Interface Parser
Loading...
Searching...
No Matches
Introduction

CLI11 lets you write your own command line programs in C++. The library is designed to be clean, intuitive, but powerful. There are no requirements beyond C++11 support (and even <regex> support not required). It works on Mac, Linux, and Windows, and has 100% test coverage on all three systems. You can simply drop in a single header file (CLI11.hpp available in releases) to use CLI11 in your own application. Other ways to integrate it into a build system are listed in the README.

The library was inspired by the Python libraries Plumbum and Click, and incorporates many of their user friendly features.

The syntax is simple and scales from a basic application to a massive physics analysis with multiple models and many parameters and switches. For example, this is a simple program that has an optional parameter that defaults to 0:

$ ./a.out
Parameter value: 0
$ ./a.out -p 4
Parameter value: 4
$ ./a.out --help
App description
Usage: ./a.out [OPTIONS]
Options:
-h,--help Print this help message and exit
-p INT Parameter

Like any good command line application, help is provided. This program can be implemented in only a few lines:

#include "CLI/CLI.hpp"
#include <iostream>
int main(int argc, char **argv) {
CLI::App app{"App description"};
// Define options
int p = 0;
app.add_option("-p", p, "Parameter");
CLI11_PARSE(app, argc, argv);
std::cout << "Parameter value: " << p << std::endl;
return 0;
}
Creates a command line program, with very few defaults.
Definition App.hpp:114
Option * add_option(std::string option_name, callback_t option_callback, std::string option_description="", bool defaulted=false, std::function< std::string()> func={})
Definition App_inl.hpp:203

Source code

Unlike some other libraries, this is enough to exit correctly and cleanly if help is requested or if incorrect arguments are passed. You can try this example out for yourself. To compile with GCC:

c++ -std=c++11 intro.cpp

Much more complicated options are handled elegantly:

std::string file;
app.add_option("-f,--file", file, "Require an existing file")
->check(CLI::ExistingFile);
CRTP * required(bool value=true)
Set the option as required.
Definition Option.hpp:118
Option * check(Validator_p validator)
Adds a shared validator.
Definition Option_inl.hpp:92

You can use any valid type; the above example could have used a boost::file_system file instead of a std::string. The value is a real value and does not require any special lookups to access. You do not have to risk typos by repeating the values after parsing like some libraries require. The library also handles positional arguments, flags, fixed or unlimited repeating options, interdependent options, flags, custom validators, help groups, and more.

You can use subcommands, as well. Subcommands support callback lambda functions when parsed, or they can be checked later. You can infinitely nest subcommands, and each is a full App instance, supporting everything listed above.

Reading/producing .ini files for configuration is also supported, as is using environment variables as input. The base App can be subclassed and customized for use in a toolkit (like GooFit). All the standard shell idioms, like --, work as well.

The guide chapters in the sidebar walk through the library step by step, starting with installation and a first program. The examples section shows complete programs: the Making a git clone walkthrough, and Example programs, an index of the programs that ship with CLI11. Feel free to contribute to the guide here if something can be improved!

API reference

The main classes are:

Name Where used
CLI::Option Options, stored in the app
CLI::App The main application or subcommands
CLI::Validator A check that can affect the type name
CLI::Formatter A subclassable formatter for help printing
CLI::ExitCode A scoped enum with exit codes
CLI::Timer A timer class, only in CLI/Timer.hpp (not in CLI11.hpp)
CLI::AutoTimer A timer that prints on deletion

Groups of related topics:

Name Description
Errors Errors that can be thrown
Validators Common validators used in CLI::Option::check()

Full indexes:

About

CLI11 was developed at the University of Cincinnati in support of the GooFit library under NSF Award 1414736. It was featured in a DIANA/HEP meeting at CERN. Please give it a try! Feedback is always welcome.