将参数包解压到字符串视图中
Unpack parameter pack into string view
可以将 char 类型的值模板参数包解压缩为(编译时)字符串。
如何将 string_view
获取到该字符串中?
我想做的事情:
int main()
{
constexpr auto s = stringify<'a', 'b', 'c'>();
constexpr std::string_view sv{ s.begin(), s.size() };
return 0;
}
尝试:
template<char ... chars>
constexpr auto stringify()
{
std::array<char, sizeof...(chars)> array = { chars... };
return array;
}
错误:
15 : <source>:15:30: error: constexpr variable 'sv' must be initialized by a constant expression
constexpr std::string_view sv{ s.begin(), s.size() };
^~~~~~~~~~~~~~~~~~~~~~~~~
15 : <source>:15:30: note: pointer to subobject of 's' is not a constant expression
有没有办法获得 main
函数中的行为?
它无法像 constexpr 一样工作,因为 s
数组位于堆栈上,所以它的地址在编译时是未知的。要修复,您可以将 s
声明为 static
.
此代码在 clang 中编译,但 GCC 仍然抛出(我认为不正确)错误:
#include <iostream>
#include <array>
#include <string_view>
template<char... chars>
struct stringify {
// you can still just get a view with the size, but this way it's a valid c-string
static constexpr std::array<char, sizeof...(chars) + 1> str = { chars..., '[=10=]' };
static constexpr std::string_view str_view{&str[0]};
};
int main() {
std::cout << stringify<'a','b','c'>::str_view;
return 0;
}
虽然它会生成有关 "sub-object."(字符...)的警告,但另一个答案解释了它起作用的原因。
可以将 char 类型的值模板参数包解压缩为(编译时)字符串。
如何将 string_view
获取到该字符串中?
我想做的事情:
int main()
{
constexpr auto s = stringify<'a', 'b', 'c'>();
constexpr std::string_view sv{ s.begin(), s.size() };
return 0;
}
尝试:
template<char ... chars>
constexpr auto stringify()
{
std::array<char, sizeof...(chars)> array = { chars... };
return array;
}
错误:
15 : <source>:15:30: error: constexpr variable 'sv' must be initialized by a constant expression
constexpr std::string_view sv{ s.begin(), s.size() };
^~~~~~~~~~~~~~~~~~~~~~~~~
15 : <source>:15:30: note: pointer to subobject of 's' is not a constant expression
有没有办法获得 main
函数中的行为?
它无法像 constexpr 一样工作,因为 s
数组位于堆栈上,所以它的地址在编译时是未知的。要修复,您可以将 s
声明为 static
.
此代码在 clang 中编译,但 GCC 仍然抛出(我认为不正确)错误:
#include <iostream>
#include <array>
#include <string_view>
template<char... chars>
struct stringify {
// you can still just get a view with the size, but this way it's a valid c-string
static constexpr std::array<char, sizeof...(chars) + 1> str = { chars..., '[=10=]' };
static constexpr std::string_view str_view{&str[0]};
};
int main() {
std::cout << stringify<'a','b','c'>::str_view;
return 0;
}
虽然它会生成有关 "sub-object."(字符...)的警告,但另一个答案解释了它起作用的原因。