16 template<
class char_t, 
size_t N>
 
   17 constexpr std::array<char_t, N> to_char_array(std::span<const char, N> svChar)
 
   19     std::array<char_t, N> result;
 
   20     for (
size_t i = 0; i < N; ++i)
 
   21         result[i] = svChar[i];
 
   25 template<
class char_t, 
string_literal array>
 
   28     static constexpr 
auto char_array =
 
   29         to_char_array<char_t>(std::span<
const char, array.size()>(array.data(), array.data() + array.size()));
 
   34 template<
class T, 
class char_t>
 
   39 #elif QX_CLANG || QX_GNU 
   40     if constexpr (std::is_same_v<char_t, char>)
 
   42         return __PRETTY_FUNCTION__;
 
   46         return string_view_type(details::char_array_helper<char_t, __PRETTY_FUNCTION__>::char_array.data());
 
   51 template<
class T, 
class char_t>
 
   52 constexpr 
typename type_strings<T, char_t>::string_view_type type_strings<T, char_t>::create_signature()
 
   54     constexpr string_view_type svFunctionSignature = create_full_signature();
 
   57     constexpr string_view_type svStartMarker = 
QX_STR_PREFIX(char_t, 
"type_strings<");
 
   58     constexpr string_view_type svEndMarker   = 
QX_STR_PREFIX(char_t, 
">::create_full_signature(");
 
   60     constexpr string_view_type svStartMarker = 
QX_STR_PREFIX(char_t, 
"T = ");
 
   61     constexpr string_view_type svEndMarker   = 
QX_STR_PREFIX(char_t, 
", char_t = ");
 
   63     constexpr string_view_type svStartMarker = 
QX_STR_PREFIX(char_t, 
"T = ");
 
   64     constexpr string_view_type svEndMarker   = 
QX_STR_PREFIX(char_t, 
";");
 
   67     size_t nStartMarker = svFunctionSignature.find(svStartMarker);
 
   68     size_t nStart       = nStartMarker != string_view_type::npos ? (nStartMarker + svStartMarker.size()) : 0;
 
   70     constexpr string_view_type classMarker  = 
QX_STR_PREFIX(char_t, 
"class ");
 
   71     size_t                     nClassMarker = svFunctionSignature.find(classMarker, nStart);
 
   72     if (nClassMarker != string_view_type::npos)
 
   73         nStart = nClassMarker + classMarker.size();
 
   75     size_t nEndMarker = svFunctionSignature.find(svEndMarker, nStart);
 
   76     size_t nEnd       = nEndMarker != string_view_type::npos ? nEndMarker : svFunctionSignature.size();
 
   79     size_t nCharCommaMarker = svFunctionSignature.rfind(
QX_CHAR_PREFIX(char_t, 
','), nEnd);
 
   80     if (nCharCommaMarker != string_view_type::npos)
 
   81         nEnd = nCharCommaMarker;
 
   84     return string_view_type(svFunctionSignature.data() + nStart, nEnd - nStart);
 
   87 template<
class T, 
class char_t>
 
   88 constexpr 
size_t type_strings<T, char_t>::get_num_template_parameters()
 
   90     const string_view_type svSignature = create_signature();
 
   92     size_t nBraceCounter = 0;
 
   96     for (
size_t i = 0; i < svSignature.size(); ++i)
 
   98         switch (svSignature[i])
 
  105                 if (svSignature.find(lambdaMarker, i + 1) == i + 1)
 
  107                 else if (nParams == 0 && nBraceCounter == 1)
 
  121             if (nBraceCounter == 1)
 
  131 template<
class T, 
class char_t>
 
  134     return create_signature();
 
  137 template<
class T, 
class char_t>
 
  140     constexpr string_view_type svStartMarker = 
QX_STR_PREFIX(char_t, 
"<");
 
  141     const string_view_type     svSignature   = create_signature();
 
  142     size_t                     nStartMarker  = svSignature.find(svStartMarker);
 
  144     if (nStartMarker != string_view_type::npos && svSignature.find(lambdaMarker, nStartMarker) == nStartMarker + 1)
 
  145         nStartMarker = string_view_type::npos;
 
  147     return string_view_type(
 
  149         nStartMarker != string_view_type::npos ? nStartMarker : svSignature.size());
 
  152 template<
class T, 
class char_t>
 
  155     std::array<string_view_type, get_num_template_parameters()> tokens;
 
  157     const string_view_type svSignature = create_signature();
 
  159     size_t nTokenStart   = 0;
 
  160     size_t nBraceCounter = 0;
 
  163     const auto add_token = [&tokens, &svSignature](
size_t nToken, 
size_t nStart, 
size_t nEnd)
 
  171         constexpr string_view_type classMarker = 
QX_STR_PREFIX(char_t, 
"class ");
 
  172         if (string_view_type(svSignature.data() + nStart, nEnd - nStart).starts_with(classMarker))
 
  173             nStart += classMarker.size();
 
  175         tokens[nToken] = string_view_type(svSignature.data() + nStart, nEnd + 1 - nStart);
 
  178     bool bLambda = 
false;
 
  180     for (
size_t i = 0; i < svSignature.size(); ++i)
 
  182         switch (svSignature[i])
 
  187             if (nTokenStart == 0)
 
  189             else if (!bLambda && svSignature.find(lambdaMarker, i + 1) == i + 1)
 
  202             if (nBraceCounter == 1)
 
  204                 add_token(nParam, nTokenStart, i - 1);
 
  212     if (tokens.size() > 0)
 
  214         size_t nTokenEnd = svSignature.size() - 1;
 
  222         add_token(nParam, nTokenStart, nTokenEnd);
 
The class allows you to get strings with information about the type, including its full name,...
 
static constexpr auto get_template_parameters()
Get type template parameters.
 
static constexpr string_view_type get_name()
Get type name (short name without template parameters)
 
static constexpr string_view_type get_signature()
Get type signature (full name with template parameters)
 
#define QX_CHAR_PREFIX(value_t, ch)
Chose witch of prefixes add to char : L or none.
 
#define QX_STR_PREFIX(value_t, str)
Chose witch of prefixes add to string : L or none.