13 template<
class char_t, 
class... args_t>
 
   15     requires std::convertible_to<const T&, qx::basic_string_view<char_t>>
 
   17     : std::basic_format_string<char_t, args_t...>(parse_format_string(value))
 
   21 template<
class char_t, 
class... args_t>
 
   25     int                       nBracesBalance  = 0;
 
   26     size_t                    nNumBracesPairs = 0;
 
   27     basic_string_view<char_t> svFormatString  = value;
 
   29     for (
size_t i = 0; i < svFormatString.size(); ++i)
 
   33             if (i + 1 < svFormatString.size() && svFormatString[i + 1] == 
QX_CHAR_PREFIX(char_t, 
'{'))
 
   43             if (i + 1 < svFormatString.size() && svFormatString[i + 1] == 
QX_CHAR_PREFIX(char_t, 
'}'))
 
   52             if (nBracesBalance < 0)
 
   54                 throw std::format_error(
 
   55                     "Format string error: num of closing braces > num of opening braces at some point of the format " 
   61     if (nBracesBalance > 0)
 
   63         throw std::format_error(
 
   64             "Format string error: num of opening braces > num of closing braces at the end of the format string");
 
   67     if (
sizeof...(args_t) != nNumBracesPairs)
 
   68         throw std::format_error(
"Format string error: num of args != num of braces pairs");
 
requires(same_variadic_args_v< args_t... >) const expr auto coalesce(args_t &&... args)
Coalesce function, C# a ?? b analogue.
 
#define QX_CHAR_PREFIX(value_t, ch)
Chose witch of prefixes add to char : L or none.