Mercurial > minori
comparison dep/fmt/doc/html/_sources/api.rst.txt @ 343:1faa72660932
*: transfer back to cmake from autotools
autotools just made lots of things more complicated than
they should have and many things broke (i.e. translations)
| author | Paper <paper@paper.us.eu.org> |
|---|---|
| date | Thu, 20 Jun 2024 05:56:06 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 342:adb79bdde329 | 343:1faa72660932 |
|---|---|
| 1 .. _string-formatting-api: | |
| 2 | |
| 3 ************* | |
| 4 API Reference | |
| 5 ************* | |
| 6 | |
| 7 The {fmt} library API consists of the following parts: | |
| 8 | |
| 9 * :ref:`fmt/core.h <core-api>`: the core API providing main formatting functions | |
| 10 for ``char``/UTF-8 with C++20 compile-time checks and minimal dependencies | |
| 11 * :ref:`fmt/format.h <format-api>`: the full format API providing additional | |
| 12 formatting functions and locale support | |
| 13 * :ref:`fmt/ranges.h <ranges-api>`: formatting of ranges and tuples | |
| 14 * :ref:`fmt/chrono.h <chrono-api>`: date and time formatting | |
| 15 * :ref:`fmt/std.h <std-api>`: formatters for standard library types | |
| 16 * :ref:`fmt/compile.h <compile-api>`: format string compilation | |
| 17 * :ref:`fmt/color.h <color-api>`: terminal color and text style | |
| 18 * :ref:`fmt/os.h <os-api>`: system APIs | |
| 19 * :ref:`fmt/ostream.h <ostream-api>`: ``std::ostream`` support | |
| 20 * :ref:`fmt/args.h <args-api>`: dynamic argument lists | |
| 21 * :ref:`fmt/printf.h <printf-api>`: ``printf`` formatting | |
| 22 * :ref:`fmt/xchar.h <xchar-api>`: optional ``wchar_t`` support | |
| 23 | |
| 24 All functions and types provided by the library reside in namespace ``fmt`` and | |
| 25 macros have prefix ``FMT_``. | |
| 26 | |
| 27 .. _core-api: | |
| 28 | |
| 29 Core API | |
| 30 ======== | |
| 31 | |
| 32 ``fmt/core.h`` defines the core API which provides main formatting functions | |
| 33 for ``char``/UTF-8 with C++20 compile-time checks. It has minimal include | |
| 34 dependencies for better compile times. This header is only beneficial when | |
| 35 using {fmt} as a library (the default) and not in the header-only mode. | |
| 36 It also provides ``formatter`` specializations for built-in and string types. | |
| 37 | |
| 38 The following functions use :ref:`format string syntax <syntax>` | |
| 39 similar to that of Python's `str.format | |
| 40 <https://docs.python.org/3/library/stdtypes.html#str.format>`_. | |
| 41 They take *fmt* and *args* as arguments. | |
| 42 | |
| 43 *fmt* is a format string that contains literal text and replacement fields | |
| 44 surrounded by braces ``{}``. The fields are replaced with formatted arguments | |
| 45 in the resulting string. `~fmt::format_string` is a format string which can be | |
| 46 implicitly constructed from a string literal or a ``constexpr`` string and is | |
| 47 checked at compile time in C++20. To pass a runtime format string wrap it in | |
| 48 `fmt::runtime`. | |
| 49 | |
| 50 *args* is an argument list representing objects to be formatted. | |
| 51 | |
| 52 I/O errors are reported as `std::system_error | |
| 53 <https://en.cppreference.com/w/cpp/error/system_error>`_ exceptions unless | |
| 54 specified otherwise. | |
| 55 | |
| 56 .. _format: | |
| 57 | |
| 58 .. doxygenfunction:: format(format_string<T...> fmt, T&&... args) -> std::string | |
| 59 .. doxygenfunction:: vformat(string_view fmt, format_args args) -> std::string | |
| 60 | |
| 61 .. doxygenfunction:: format_to(OutputIt out, format_string<T...> fmt, T&&... args) -> OutputIt | |
| 62 .. doxygenfunction:: format_to_n(OutputIt out, size_t n, format_string<T...> fmt, T&&... args) -> format_to_n_result<OutputIt> | |
| 63 .. doxygenfunction:: formatted_size(format_string<T...> fmt, T&&... args) -> size_t | |
| 64 | |
| 65 .. doxygenstruct:: fmt::format_to_n_result | |
| 66 :members: | |
| 67 | |
| 68 .. _print: | |
| 69 | |
| 70 .. doxygenfunction:: fmt::print(format_string<T...> fmt, T&&... args) | |
| 71 .. doxygenfunction:: fmt::vprint(string_view fmt, format_args args) | |
| 72 | |
| 73 .. doxygenfunction:: print(std::FILE *f, format_string<T...> fmt, T&&... args) | |
| 74 .. doxygenfunction:: vprint(std::FILE *f, string_view fmt, format_args args) | |
| 75 | |
| 76 Compile-Time Format String Checks | |
| 77 --------------------------------- | |
| 78 | |
| 79 Compile-time format string checks are enabled by default on compilers | |
| 80 that support C++20 ``consteval``. On older compilers you can use the | |
| 81 :ref:`FMT_STRING <legacy-checks>`: macro defined in ``fmt/format.h`` instead. | |
| 82 | |
| 83 Unused arguments are allowed as in Python's `str.format` and ordinary functions. | |
| 84 | |
| 85 .. doxygenclass:: fmt::basic_format_string | |
| 86 :members: | |
| 87 | |
| 88 .. doxygentypedef:: fmt::format_string | |
| 89 | |
| 90 .. doxygenfunction:: fmt::runtime(string_view) -> runtime_format_string<> | |
| 91 | |
| 92 .. _udt: | |
| 93 | |
| 94 Formatting User-Defined Types | |
| 95 ----------------------------- | |
| 96 | |
| 97 The {fmt} library provides formatters for many standard C++ types. | |
| 98 See :ref:`fmt/ranges.h <ranges-api>` for ranges and tuples including standard | |
| 99 containers such as ``std::vector``, :ref:`fmt/chrono.h <chrono-api>` for date | |
| 100 and time formatting and :ref:`fmt/std.h <std-api>` for other standard library | |
| 101 types. | |
| 102 | |
| 103 There are two ways to make a user-defined type formattable: providing a | |
| 104 ``format_as`` function or specializing the ``formatter`` struct template. | |
| 105 | |
| 106 Use ``format_as`` if you want to make your type formattable as some other type | |
| 107 with the same format specifiers. The ``format_as`` function should take an | |
| 108 object of your type and return an object of a formattable type. It should be | |
| 109 defined in the same namespace as your type. | |
| 110 | |
| 111 Example (https://godbolt.org/z/nvME4arz8):: | |
| 112 | |
| 113 #include <fmt/format.h> | |
| 114 | |
| 115 namespace kevin_namespacy { | |
| 116 enum class film { | |
| 117 house_of_cards, american_beauty, se7en = 7 | |
| 118 }; | |
| 119 auto format_as(film f) { return fmt::underlying(f); } | |
| 120 } | |
| 121 | |
| 122 int main() { | |
| 123 fmt::print("{}\n", kevin_namespacy::film::se7en); // prints "7" | |
| 124 } | |
| 125 | |
| 126 Using specialization is more complex but gives you full control over parsing and | |
| 127 formatting. To use this method specialize the ``formatter`` struct template for | |
| 128 your type and implement ``parse`` and ``format`` methods. | |
| 129 | |
| 130 The recommended way of defining a formatter is by reusing an existing one via | |
| 131 inheritance or composition. This way you can support standard format specifiers | |
| 132 without implementing them yourself. For example:: | |
| 133 | |
| 134 // color.h: | |
| 135 #include <fmt/core.h> | |
| 136 | |
| 137 enum class color {red, green, blue}; | |
| 138 | |
| 139 template <> struct fmt::formatter<color>: formatter<string_view> { | |
| 140 // parse is inherited from formatter<string_view>. | |
| 141 | |
| 142 auto format(color c, format_context& ctx) const; | |
| 143 }; | |
| 144 | |
| 145 // color.cc: | |
| 146 #include "color.h" | |
| 147 #include <fmt/format.h> | |
| 148 | |
| 149 auto fmt::formatter<color>::format(color c, format_context& ctx) const { | |
| 150 string_view name = "unknown"; | |
| 151 switch (c) { | |
| 152 case color::red: name = "red"; break; | |
| 153 case color::green: name = "green"; break; | |
| 154 case color::blue: name = "blue"; break; | |
| 155 } | |
| 156 return formatter<string_view>::format(name, ctx); | |
| 157 } | |
| 158 | |
| 159 Note that ``formatter<string_view>::format`` is defined in ``fmt/format.h`` so | |
| 160 it has to be included in the source file. Since ``parse`` is inherited from | |
| 161 ``formatter<string_view>`` it will recognize all string format specifications, | |
| 162 for example | |
| 163 | |
| 164 .. code-block:: c++ | |
| 165 | |
| 166 fmt::format("{:>10}", color::blue) | |
| 167 | |
| 168 will return ``" blue"``. | |
| 169 | |
| 170 The experimental ``nested_formatter`` provides an easy way of applying a | |
| 171 formatter to one or more subobjects. | |
| 172 | |
| 173 For example:: | |
| 174 | |
| 175 #include <fmt/format.h> | |
| 176 | |
| 177 struct point { | |
| 178 double x, y; | |
| 179 }; | |
| 180 | |
| 181 template <> | |
| 182 struct fmt::formatter<point> : nested_formatter<double> { | |
| 183 auto format(point p, format_context& ctx) const { | |
| 184 return write_padded(ctx, [=](auto out) { | |
| 185 return format_to(out, "({}, {})", nested(p.x), nested(p.y)); | |
| 186 }); | |
| 187 } | |
| 188 }; | |
| 189 | |
| 190 int main() { | |
| 191 fmt::print("[{:>20.2f}]", point{1, 2}); | |
| 192 } | |
| 193 | |
| 194 prints:: | |
| 195 | |
| 196 [ (1.00, 2.00)] | |
| 197 | |
| 198 Notice that fill, align and width are applied to the whole object which is the | |
| 199 recommended behavior while the remaining specifiers apply to elements. | |
| 200 | |
| 201 In general the formatter has the following form:: | |
| 202 | |
| 203 template <> struct fmt::formatter<T> { | |
| 204 // Parses format specifiers and stores them in the formatter. | |
| 205 // | |
| 206 // [ctx.begin(), ctx.end()) is a, possibly empty, character range that | |
| 207 // contains a part of the format string starting from the format | |
| 208 // specifications to be parsed, e.g. in | |
| 209 // | |
| 210 // fmt::format("{:f} continued", ...); | |
| 211 // | |
| 212 // the range will contain "f} continued". The formatter should parse | |
| 213 // specifiers until '}' or the end of the range. In this example the | |
| 214 // formatter should parse the 'f' specifier and return an iterator | |
| 215 // pointing to '}'. | |
| 216 constexpr auto parse(format_parse_context& ctx) | |
| 217 -> format_parse_context::iterator; | |
| 218 | |
| 219 // Formats value using the parsed format specification stored in this | |
| 220 // formatter and writes the output to ctx.out(). | |
| 221 auto format(const T& value, format_context& ctx) const | |
| 222 -> format_context::iterator; | |
| 223 }; | |
| 224 | |
| 225 It is recommended to at least support fill, align and width that apply to the | |
| 226 whole object and have the same semantics as in standard formatters. | |
| 227 | |
| 228 You can also write a formatter for a hierarchy of classes:: | |
| 229 | |
| 230 // demo.h: | |
| 231 #include <type_traits> | |
| 232 #include <fmt/core.h> | |
| 233 | |
| 234 struct A { | |
| 235 virtual ~A() {} | |
| 236 virtual std::string name() const { return "A"; } | |
| 237 }; | |
| 238 | |
| 239 struct B : A { | |
| 240 virtual std::string name() const { return "B"; } | |
| 241 }; | |
| 242 | |
| 243 template <typename T> | |
| 244 struct fmt::formatter<T, std::enable_if_t<std::is_base_of<A, T>::value, char>> : | |
| 245 fmt::formatter<std::string> { | |
| 246 auto format(const A& a, format_context& ctx) const { | |
| 247 return fmt::formatter<std::string>::format(a.name(), ctx); | |
| 248 } | |
| 249 }; | |
| 250 | |
| 251 // demo.cc: | |
| 252 #include "demo.h" | |
| 253 #include <fmt/format.h> | |
| 254 | |
| 255 int main() { | |
| 256 B b; | |
| 257 A& a = b; | |
| 258 fmt::print("{}", a); // prints "B" | |
| 259 } | |
| 260 | |
| 261 Providing both a ``formatter`` specialization and a ``format_as`` overload is | |
| 262 disallowed. | |
| 263 | |
| 264 Named Arguments | |
| 265 --------------- | |
| 266 | |
| 267 .. doxygenfunction:: fmt::arg(const S&, const T&) | |
| 268 | |
| 269 Named arguments are not supported in compile-time checks at the moment. | |
| 270 | |
| 271 Argument Lists | |
| 272 -------------- | |
| 273 | |
| 274 You can create your own formatting function with compile-time checks and small | |
| 275 binary footprint, for example (https://godbolt.org/z/vajfWEG4b): | |
| 276 | |
| 277 .. code:: c++ | |
| 278 | |
| 279 #include <fmt/core.h> | |
| 280 | |
| 281 void vlog(const char* file, int line, fmt::string_view format, | |
| 282 fmt::format_args args) { | |
| 283 fmt::print("{}: {}: ", file, line); | |
| 284 fmt::vprint(format, args); | |
| 285 } | |
| 286 | |
| 287 template <typename... T> | |
| 288 void log(const char* file, int line, fmt::format_string<T...> format, T&&... args) { | |
| 289 vlog(file, line, format, fmt::make_format_args(args...)); | |
| 290 } | |
| 291 | |
| 292 #define MY_LOG(format, ...) log(__FILE__, __LINE__, format, __VA_ARGS__) | |
| 293 | |
| 294 MY_LOG("invalid squishiness: {}", 42); | |
| 295 | |
| 296 Note that ``vlog`` is not parameterized on argument types which improves compile | |
| 297 times and reduces binary code size compared to a fully parameterized version. | |
| 298 | |
| 299 .. doxygenfunction:: fmt::make_format_args(const Args&...) | |
| 300 | |
| 301 .. doxygenclass:: fmt::format_arg_store | |
| 302 :members: | |
| 303 | |
| 304 .. doxygenclass:: fmt::basic_format_args | |
| 305 :members: | |
| 306 | |
| 307 .. doxygentypedef:: fmt::format_args | |
| 308 | |
| 309 .. doxygenclass:: fmt::basic_format_arg | |
| 310 :members: | |
| 311 | |
| 312 .. doxygenclass:: fmt::basic_format_parse_context | |
| 313 :members: | |
| 314 | |
| 315 .. doxygenclass:: fmt::basic_format_context | |
| 316 :members: | |
| 317 | |
| 318 .. doxygentypedef:: fmt::format_context | |
| 319 | |
| 320 .. _args-api: | |
| 321 | |
| 322 Dynamic Argument Lists | |
| 323 ---------------------- | |
| 324 | |
| 325 The header ``fmt/args.h`` provides ``dynamic_format_arg_store``, a builder-like | |
| 326 API that can be used to construct format argument lists dynamically. | |
| 327 | |
| 328 .. doxygenclass:: fmt::dynamic_format_arg_store | |
| 329 :members: | |
| 330 | |
| 331 Compatibility | |
| 332 ------------- | |
| 333 | |
| 334 .. doxygenclass:: fmt::basic_string_view | |
| 335 :members: | |
| 336 | |
| 337 .. doxygentypedef:: fmt::string_view | |
| 338 | |
| 339 .. _format-api: | |
| 340 | |
| 341 Format API | |
| 342 ========== | |
| 343 | |
| 344 ``fmt/format.h`` defines the full format API providing additional formatting | |
| 345 functions and locale support. | |
| 346 | |
| 347 Literal-Based API | |
| 348 ----------------- | |
| 349 | |
| 350 The following user-defined literals are defined in ``fmt/format.h``. | |
| 351 | |
| 352 .. doxygenfunction:: operator""_a() | |
| 353 | |
| 354 Utilities | |
| 355 --------- | |
| 356 | |
| 357 .. doxygenfunction:: fmt::ptr(T p) -> const void* | |
| 358 .. doxygenfunction:: fmt::ptr(const std::unique_ptr<T, Deleter> &p) -> const void* | |
| 359 .. doxygenfunction:: fmt::ptr(const std::shared_ptr<T> &p) -> const void* | |
| 360 | |
| 361 .. doxygenfunction:: fmt::underlying(Enum e) -> typename std::underlying_type<Enum>::type | |
| 362 | |
| 363 .. doxygenfunction:: fmt::to_string(const T &value) -> std::string | |
| 364 | |
| 365 .. doxygenfunction:: fmt::join(Range &&range, string_view sep) -> join_view<detail::iterator_t<Range>, detail::sentinel_t<Range>> | |
| 366 | |
| 367 .. doxygenfunction:: fmt::join(It begin, Sentinel end, string_view sep) -> join_view<It, Sentinel> | |
| 368 | |
| 369 .. doxygenfunction:: fmt::group_digits(T value) -> group_digits_view<T> | |
| 370 | |
| 371 .. doxygenclass:: fmt::detail::buffer | |
| 372 :members: | |
| 373 | |
| 374 .. doxygenclass:: fmt::basic_memory_buffer | |
| 375 :protected-members: | |
| 376 :members: | |
| 377 | |
| 378 System Errors | |
| 379 ------------- | |
| 380 | |
| 381 {fmt} does not use ``errno`` to communicate errors to the user, but it may call | |
| 382 system functions which set ``errno``. Users should not make any assumptions | |
| 383 about the value of ``errno`` being preserved by library functions. | |
| 384 | |
| 385 .. doxygenfunction:: fmt::system_error | |
| 386 | |
| 387 .. doxygenfunction:: fmt::format_system_error | |
| 388 | |
| 389 Custom Allocators | |
| 390 ----------------- | |
| 391 | |
| 392 The {fmt} library supports custom dynamic memory allocators. | |
| 393 A custom allocator class can be specified as a template argument to | |
| 394 :class:`fmt::basic_memory_buffer`:: | |
| 395 | |
| 396 using custom_memory_buffer = | |
| 397 fmt::basic_memory_buffer<char, fmt::inline_buffer_size, custom_allocator>; | |
| 398 | |
| 399 It is also possible to write a formatting function that uses a custom | |
| 400 allocator:: | |
| 401 | |
| 402 using custom_string = | |
| 403 std::basic_string<char, std::char_traits<char>, custom_allocator>; | |
| 404 | |
| 405 custom_string vformat(custom_allocator alloc, fmt::string_view format_str, | |
| 406 fmt::format_args args) { | |
| 407 auto buf = custom_memory_buffer(alloc); | |
| 408 fmt::vformat_to(std::back_inserter(buf), format_str, args); | |
| 409 return custom_string(buf.data(), buf.size(), alloc); | |
| 410 } | |
| 411 | |
| 412 template <typename ...Args> | |
| 413 inline custom_string format(custom_allocator alloc, | |
| 414 fmt::string_view format_str, | |
| 415 const Args& ... args) { | |
| 416 return vformat(alloc, format_str, fmt::make_format_args(args...)); | |
| 417 } | |
| 418 | |
| 419 The allocator will be used for the output container only. Formatting functions | |
| 420 normally don't do any allocations for built-in and string types except for | |
| 421 non-default floating-point formatting that occasionally falls back on | |
| 422 ``sprintf``. | |
| 423 | |
| 424 Locale | |
| 425 ------ | |
| 426 | |
| 427 All formatting is locale-independent by default. Use the ``'L'`` format | |
| 428 specifier to insert the appropriate number separator characters from the | |
| 429 locale:: | |
| 430 | |
| 431 #include <fmt/core.h> | |
| 432 #include <locale> | |
| 433 | |
| 434 std::locale::global(std::locale("en_US.UTF-8")); | |
| 435 auto s = fmt::format("{:L}", 1000000); // s == "1,000,000" | |
| 436 | |
| 437 ``fmt/format.h`` provides the following overloads of formatting functions that | |
| 438 take ``std::locale`` as a parameter. The locale type is a template parameter to | |
| 439 avoid the expensive ``<locale>`` include. | |
| 440 | |
| 441 .. doxygenfunction:: format(const Locale& loc, format_string<T...> fmt, T&&... args) -> std::string | |
| 442 .. doxygenfunction:: format_to(OutputIt out, const Locale& loc, format_string<T...> fmt, T&&... args) -> OutputIt | |
| 443 .. doxygenfunction:: formatted_size(const Locale& loc, format_string<T...> fmt, T&&... args) -> size_t | |
| 444 | |
| 445 .. _legacy-checks: | |
| 446 | |
| 447 Legacy Compile-Time Format String Checks | |
| 448 ---------------------------------------- | |
| 449 | |
| 450 ``FMT_STRING`` enables compile-time checks on older compilers. It requires C++14 | |
| 451 or later and is a no-op in C++11. | |
| 452 | |
| 453 .. doxygendefine:: FMT_STRING | |
| 454 | |
| 455 To force the use of legacy compile-time checks, define the preprocessor variable | |
| 456 ``FMT_ENFORCE_COMPILE_STRING``. When set, functions accepting ``FMT_STRING`` | |
| 457 will fail to compile with regular strings. | |
| 458 | |
| 459 .. _ranges-api: | |
| 460 | |
| 461 Range and Tuple Formatting | |
| 462 ========================== | |
| 463 | |
| 464 The library also supports convenient formatting of ranges and tuples:: | |
| 465 | |
| 466 #include <fmt/ranges.h> | |
| 467 | |
| 468 std::tuple<char, int, float> t{'a', 1, 2.0f}; | |
| 469 // Prints "('a', 1, 2.0)" | |
| 470 fmt::print("{}", t); | |
| 471 | |
| 472 | |
| 473 NOTE: currently, the overload of ``fmt::join`` for iterables exists in the main | |
| 474 ``format.h`` header, but expect this to change in the future. | |
| 475 | |
| 476 Using ``fmt::join``, you can separate tuple elements with a custom separator:: | |
| 477 | |
| 478 #include <fmt/ranges.h> | |
| 479 | |
| 480 std::tuple<int, char> t = {1, 'a'}; | |
| 481 // Prints "1, a" | |
| 482 fmt::print("{}", fmt::join(t, ", ")); | |
| 483 | |
| 484 .. _chrono-api: | |
| 485 | |
| 486 Date and Time Formatting | |
| 487 ======================== | |
| 488 | |
| 489 ``fmt/chrono.h`` provides formatters for | |
| 490 | |
| 491 * `std::chrono::duration <https://en.cppreference.com/w/cpp/chrono/duration>`_ | |
| 492 * `std::chrono::time_point | |
| 493 <https://en.cppreference.com/w/cpp/chrono/time_point>`_ | |
| 494 * `std::tm <https://en.cppreference.com/w/cpp/chrono/c/tm>`_ | |
| 495 | |
| 496 The format syntax is described in :ref:`chrono-specs`. | |
| 497 | |
| 498 **Example**:: | |
| 499 | |
| 500 #include <fmt/chrono.h> | |
| 501 | |
| 502 int main() { | |
| 503 std::time_t t = std::time(nullptr); | |
| 504 | |
| 505 // Prints "The date is 2020-11-07." (with the current date): | |
| 506 fmt::print("The date is {:%Y-%m-%d}.", fmt::localtime(t)); | |
| 507 | |
| 508 using namespace std::literals::chrono_literals; | |
| 509 | |
| 510 // Prints "Default format: 42s 100ms": | |
| 511 fmt::print("Default format: {} {}\n", 42s, 100ms); | |
| 512 | |
| 513 // Prints "strftime-like format: 03:15:30": | |
| 514 fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s); | |
| 515 } | |
| 516 | |
| 517 .. doxygenfunction:: localtime(std::time_t time) | |
| 518 | |
| 519 .. doxygenfunction:: gmtime(std::time_t time) | |
| 520 | |
| 521 .. _std-api: | |
| 522 | |
| 523 Standard Library Types Formatting | |
| 524 ================================= | |
| 525 | |
| 526 ``fmt/std.h`` provides formatters for: | |
| 527 | |
| 528 * `std::filesystem::path <https://en.cppreference.com/w/cpp/filesystem/path>`_ | |
| 529 * `std::thread::id <https://en.cppreference.com/w/cpp/thread/thread/id>`_ | |
| 530 * `std::monostate <https://en.cppreference.com/w/cpp/utility/variant/monostate>`_ | |
| 531 * `std::variant <https://en.cppreference.com/w/cpp/utility/variant/variant>`_ | |
| 532 * `std::optional <https://en.cppreference.com/w/cpp/utility/optional>`_ | |
| 533 | |
| 534 Formatting Variants | |
| 535 ------------------- | |
| 536 | |
| 537 A ``std::variant`` is only formattable if every variant alternative is formattable, and requires the | |
| 538 ``__cpp_lib_variant`` `library feature <https://en.cppreference.com/w/cpp/feature_test>`_. | |
| 539 | |
| 540 **Example**:: | |
| 541 | |
| 542 #include <fmt/std.h> | |
| 543 | |
| 544 std::variant<char, float> v0{'x'}; | |
| 545 // Prints "variant('x')" | |
| 546 fmt::print("{}", v0); | |
| 547 | |
| 548 std::variant<std::monostate, char> v1; | |
| 549 // Prints "variant(monostate)" | |
| 550 | |
| 551 .. _compile-api: | |
| 552 | |
| 553 Format String Compilation | |
| 554 ========================= | |
| 555 | |
| 556 ``fmt/compile.h`` provides format string compilation enabled via the | |
| 557 ``FMT_COMPILE`` macro or the ``_cf`` user-defined literal. Format strings | |
| 558 marked with ``FMT_COMPILE`` or ``_cf`` are parsed, checked and converted into | |
| 559 efficient formatting code at compile-time. This supports arguments of built-in | |
| 560 and string types as well as user-defined types with ``format`` functions taking | |
| 561 the format context type as a template parameter in their ``formatter`` | |
| 562 specializations. For example:: | |
| 563 | |
| 564 template <> struct fmt::formatter<point> { | |
| 565 constexpr auto parse(format_parse_context& ctx); | |
| 566 | |
| 567 template <typename FormatContext> | |
| 568 auto format(const point& p, FormatContext& ctx) const; | |
| 569 }; | |
| 570 | |
| 571 Format string compilation can generate more binary code compared to the default | |
| 572 API and is only recommended in places where formatting is a performance | |
| 573 bottleneck. | |
| 574 | |
| 575 .. doxygendefine:: FMT_COMPILE | |
| 576 | |
| 577 .. doxygenfunction:: operator""_cf() | |
| 578 | |
| 579 .. _color-api: | |
| 580 | |
| 581 Terminal Color and Text Style | |
| 582 ============================= | |
| 583 | |
| 584 ``fmt/color.h`` provides support for terminal color and text style output. | |
| 585 | |
| 586 .. doxygenfunction:: print(const text_style &ts, const S &format_str, const Args&... args) | |
| 587 | |
| 588 .. doxygenfunction:: fg(detail::color_type) | |
| 589 | |
| 590 .. doxygenfunction:: bg(detail::color_type) | |
| 591 | |
| 592 .. doxygenfunction:: styled(const T& value, text_style ts) | |
| 593 | |
| 594 .. _os-api: | |
| 595 | |
| 596 System APIs | |
| 597 =========== | |
| 598 | |
| 599 .. doxygenclass:: fmt::ostream | |
| 600 :members: | |
| 601 | |
| 602 .. doxygenfunction:: fmt::windows_error | |
| 603 | |
| 604 .. _ostream-api: | |
| 605 | |
| 606 ``std::ostream`` Support | |
| 607 ======================== | |
| 608 | |
| 609 ``fmt/ostream.h`` provides ``std::ostream`` support including formatting of | |
| 610 user-defined types that have an overloaded insertion operator (``operator<<``). | |
| 611 In order to make a type formattable via ``std::ostream`` you should provide a | |
| 612 ``formatter`` specialization inherited from ``ostream_formatter``:: | |
| 613 | |
| 614 #include <fmt/ostream.h> | |
| 615 | |
| 616 struct date { | |
| 617 int year, month, day; | |
| 618 | |
| 619 friend std::ostream& operator<<(std::ostream& os, const date& d) { | |
| 620 return os << d.year << '-' << d.month << '-' << d.day; | |
| 621 } | |
| 622 }; | |
| 623 | |
| 624 template <> struct fmt::formatter<date> : ostream_formatter {}; | |
| 625 | |
| 626 std::string s = fmt::format("The date is {}", date{2012, 12, 9}); | |
| 627 // s == "The date is 2012-12-9" | |
| 628 | |
| 629 .. doxygenfunction:: streamed(const T &) | |
| 630 | |
| 631 .. doxygenfunction:: print(std::ostream &os, format_string<T...> fmt, T&&... args) | |
| 632 | |
| 633 .. _printf-api: | |
| 634 | |
| 635 ``printf`` Formatting | |
| 636 ===================== | |
| 637 | |
| 638 The header ``fmt/printf.h`` provides ``printf``-like formatting functionality. | |
| 639 The following functions use `printf format string syntax | |
| 640 <https://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html>`_ with | |
| 641 the POSIX extension for positional arguments. Unlike their standard | |
| 642 counterparts, the ``fmt`` functions are type-safe and throw an exception if an | |
| 643 argument type doesn't match its format specification. | |
| 644 | |
| 645 .. doxygenfunction:: printf(string_view fmt, const T&... args) -> int | |
| 646 | |
| 647 .. doxygenfunction:: fprintf(std::FILE *f, const S &fmt, const T&... args) -> int | |
| 648 | |
| 649 .. doxygenfunction:: sprintf(const S&, const T&...) | |
| 650 | |
| 651 .. _xchar-api: | |
| 652 | |
| 653 ``wchar_t`` Support | |
| 654 =================== | |
| 655 | |
| 656 The optional header ``fmt/xchar.h`` provides support for ``wchar_t`` and exotic | |
| 657 character types. | |
| 658 | |
| 659 .. doxygenstruct:: fmt::is_char | |
| 660 | |
| 661 .. doxygentypedef:: fmt::wstring_view | |
| 662 | |
| 663 .. doxygentypedef:: fmt::wformat_context | |
| 664 | |
| 665 .. doxygenfunction:: fmt::to_wstring(const T &value) | |
| 666 | |
| 667 Compatibility with C++20 ``std::format`` | |
| 668 ======================================== | |
| 669 | |
| 670 {fmt} implements nearly all of the `C++20 formatting library | |
| 671 <https://en.cppreference.com/w/cpp/utility/format>`_ with the following | |
| 672 differences: | |
| 673 | |
| 674 * Names are defined in the ``fmt`` namespace instead of ``std`` to avoid | |
| 675 collisions with standard library implementations. | |
| 676 * Width calculation doesn't use grapheme clusterization. The latter has been | |
| 677 implemented in a separate branch but hasn't been integrated yet. | |
| 678 * Most C++20 chrono types are not supported yet. |
