C++11:用另一个 constexpr char 数组初始化 constexpr char 数组

Tru*_*uLa 6 c++ arrays template-meta-programming constexpr c++11

我想用constexpr char[]另一个constexpr char []成员初始化成员。可以在上面C++11或者上面做吗?

#include <iostream>

struct Base {
 static constexpr char ValueOne[] = "One";
 static constexpr char ValueTwo[] = "Two";
};

template <typename T>
struct ValueOneHolder {
  static constexpr char Value[] = T::ValueOne; // << How can one initialize this?
};

int main() {
  std::cout << ValueOneHolder<Base>::Value << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

hut*_*rny 2

在此特定示例中,您可以将 Value 声明如下:

template <typename T>
struct ValueOneHolder {
  static constexpr auto Value = T::ValueOne; // << How can one initialize this?
};
Run Code Online (Sandbox Code Playgroud)

请注意,除非您切换到 -std=c++17 或在源文件中添加以下行,否则 GCC 将无法链接此示例。

constexpr char Base::ValueOne[];
constexpr char Base::ValueTwo[];
Run Code Online (Sandbox Code Playgroud)

使用 C++14,还可以制作 constexpr 字符串(或其子字符串)的 constexpr 副本,如下例所示:

template<typename CharT, size_t Size>
struct basic_cestring {
    using value_type = CharT;
    template<size_t... I> constexpr
    basic_cestring(const char* str, index_sequence<I...>)
      : _data{str[I]...} {}
    inline constexpr operator const CharT* () const { return _data; }
    const CharT _data[Size + 1];
};

template<size_t Size>
struct cestring : public basic_cestring<char, Size>  {
    using index = make_index_sequence<Size>;
    constexpr cestring(const char* str)
    : basic_cestring<char, Size>(str, index{}) {}
};
Run Code Online (Sandbox Code Playgroud)