为什么以下文字运算符模板无法识别?
template<char... Chars>
constexpr int operator"" _p(){
return 0;
}
int main()
{
int fs1 = "123"_p;
}
更新: 感谢我现在使用的答案:
#include <avr/pgmspace.h>
template<typename C, C... CC>
struct PgmString {
static constexpr const char* str(){
return &data[0];
}
static constexpr const char data[] PROGMEM = {CC..., '\0'};
};
template<typename C, C... CC>
constexpr const char PgmString<C, CC...>::data[] PROGMEM;
template<typename C, C... CC>
constexpr PgmString<C, CC...> operator"" _pgm(){
return PgmString<C, CC...>();
}
这会将字符串放入 AVR 微控制器的闪存中。 但是,如果我将文字字符串长度增加一个字符,则使用的闪存大小会增加两个(!)字节。
gcc/clang 有 扩展 允许:
template<typename Char, Char... Cs>
constexpr int operator"" _p(){
return 0;
}
然后
int main()
{
int fs1 = "123"_p;
}
您期望的文字形式不存在。只有整型和浮点文字具有模板形式;字符串和字符文字则不然。
更新的版本可能是:
#include <string_view>
template<std::size_t N>
struct template_string
{
constexpr template_string(const char(&string)[N])
{
for (std::size_t n{ 0ul }; n < N; ++n) m_string[n] = string[n];
}
constexpr std::string_view sv() const noexcept
{
return std::string_view{m_string,N-1};
}
char m_string[N]{};
};
template<template_string string_v>
struct foo_t
{
static constexpr std::string_view string{string_v.sv()};
};
using namespace std::string_view_literals;
int main()
{
foo_t<"Hello world!"> foo;
static_assert(foo.string == "Hello world!"sv);
}