1) 如何在struct
/class
中声明static constexpr char []
?
可以通过下面的方法实现:
以下是一个完整的工作示例:
struct bar
{ static constexpr char value[] = "foo"; };
constexpr char bar::value[];
int main ()
{
std::cout << bar::value << std::endl;
}
我猜您忘记了 bar::value[]
行。
2) 如果 1) 是假的,有没有更好的解决办法来克服这个 static constexpr char *
?
不适用。
3) 或者对于这种情况,旧的 static const char []
仍然是最好的方法吗?
取决于您要解决的问题;但通常我建议避免使用 C 风格数组,并使用新的 C++11 std::array
4) 我测试了一个可以工作但远非“干净”的解决方案[...] 它完美地工作,但我必须声明 char 的大小 std::array
:(
我向您提出一个解决方案(不幸的是,它从 C++14 开始工作,但制作一个 C++11 版本并不太困难),以便从传递的参数“Hell”中检测正确的大小。
观察使用 std::make_index_sequence
和 std::index_sequence
将 char[]
变量的单个字符传递给 std::array
。
template <std::size_t Dim, std::size_t ... Is>
constexpr std::array<char, Dim> gceH (char const (&str)[Dim],
std::index_sequence<Is...> const &)
{ return { { str[Is]... } }; }
template <std::size_t Dim>
constexpr std::array<char, Dim> getConstExpr (char const (&str)[Dim])
{ return gceH(str, std::make_index_sequence<Dim>{}); }
int main ()
{
constexpr auto f = getConstExpr("Hell");
static_assert( 5U == f.size(), "!" );
}
--编辑--
根据Swift的建议(谢谢!),使用模板类型代替char
,将getConstExpr()
转换为更灵活的函数。
因此,getConstExpr()
和辅助函数(gceH()
)可以编写如下:
template <typename T, std::size_t Dim, std::size_t ... Is>
constexpr std::array<T, Dim> gceH (T const (&str)[Dim],
std::index_sequence<Is...> const &)
{ return { { str[Is]... } }; }
template <typename T, std::size_t Dim>
constexpr std::array<T, Dim> getConstExpr (T const (&str)[Dim])
{ return gceH(str, std::make_index_sequence<Dim>{}); }