CLI11, a powerful library for writing beautiful command line interfaces in C++11, has been updated to 2.0. A lot of deprecated things have been removed, and there was a lot of cleanup under-the-hood; making CLI11 simpler. A few defaults have changed slightly, like better TOML support by default.
CLI11 does a better job than ever understanding any sort of container you provide - complex numbers are natively supported, along with atomic types. A long requested feature, simple version flags, has been added. Subcommands are more customizable. And there have been quite a few bugfixes for rare issues.
Key new features
TOML upgrade
Introduced in 1.9, the default configuration output is now TOML compliant. Multiline TOML is now supported, and you can control the quote character. Short-only and positional arguments are now supported. As always, you can add your own output formats with the extension points and class provided.
Container improvements
add_*
commands are better at adapting to the input you provide. The
add_complex
method has been removed, because add_option
now supports complex
numbers directly (this was the only removal in 2.0 that was not deprecated
beforehand). You can add atomics as well now.
Deprecated for a while, the add_set
commands have been removed; for several
releases sets have been better described by validators (and that was used in the
backend for add_set
anyway).
Also the deprecated defaulted
boolean has been removed; please set a default
or use ->capture_default_str()
instead, which is far more readable then a
mysterious boolean. Also, you can set
app.option_defaults()->always_capture_default()
to always capture the default
string for all your options (don’t add an unprintable or uninitialized variable,
obviously).
Before:
using namespace std::complex_literals;
std::complex<double> v = 1i + 2;
app.add_complex("--val", v, "Help", true);
After:
using namespace std::complex_literals;
std::complex<double> v = 1i + 2;
app.add_option("--val", v, "Help")
->capture_default_str();
Other features
Subcommands got several new features, and some fixes. They now support aliases.
You can hide one with ->silent()
. You can now add a version flag very easily
with .set_version_flag(...)
. And quite a few bugs have been fixed, including
avoiding a clash with windows.h
, mixing required config files and a help flag,
and more.
Backend changes
A lot of work on CI (heaver use of GHA and less Travis CI) and testing went into this release. The testing framework was moved from GoogleTest / GoogleMock to Catch2. This enabled simpler, nicer tests that can access more complex features (like sections / parametrization) much more simply than before. We also only used GoogleMock for matchers, which was occasionally a pain. The compiler support for Catch2 is much better at both ends (kind-of-old and very new) than GoogleTest.
The MakeSingleHeader script has been rewritten. It’s more flexible now, with explicit markers in the code. This will enable future work on optional pre-compilation to happen, and will enable some parts of the library to become optional (such as the more uncommon validators). It should still support all the features of the original script, including the ability to generate a branded CLI11 header.