如何在编译时获取多个字符串的最大长度?

问题描述 投票:0回答:0

我有许多字符串,想找到它们的最大长度并将其分配给一个 constexpr 变量。我遇到了这种方法:

template <uint32_t N>
constexpr uint32_t get_string_length (const char (&str) [N])
{
  return N;
}

template <uint32_t... N>
constexpr uint32_t max_string_length_all (const char (&... strs) [N])
{
  constexpr uint32_t lengths [] = {get_string_length (strs)...};
  uint32_t max_len              = 0;
  for (uint32_t len : lengths)
  {
    if (len > max_len)
    {
      max_len = len;
    }
  }
  return max_len;
}

这应该这样称呼:

inline char const my_string_0 [] = "my string 0"; // several of these with different string lengths
constexpr uint32_t max = max_string_length_all (my_string_0, my_string_1, my_string_3); 

但我明白了

error: 'strs#0' is not a constant expression

max_string_length_all
的第一行(也适用于strs#1和strs#2) 我使用 GCC 设置为 C++ 17。我不熟悉可变参数函数和折叠表达式,所以我不知道如何修复它。

万一它可以解决下一步将是:

  typedef struct
  {
    char const * my_string;
    // other struct members
  } T_my_struct;
  T_my_struct my_array []
  = {
      {my_string_0, /*other data*/},
      {my_string_1, /*other data*/},
      // more
    };

现在将

my_array
传递给类似
max_string_length_all
的东西,并在编译时再次获得最大字符串长度。 这可能吗?

c++ c++17 variadic-functions fold
© www.soinside.com 2019 - 2024. All rights reserved.