C++ 文字运算符模板无法识别

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

为什么以下文字运算符模板无法识别?

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 微控制器的闪存中。 但是,如果我将文字字符串长度增加一个字符,则使用的闪存大小会增加两个(!)字节。

c++ literals
3个回答
7
投票

gcc/clang 有 扩展 允许:

template<typename Char, Char... Cs>
constexpr int operator"" _p(){
    return 0;
}

然后

int main()
{
    int  fs1 = "123"_p;
}

5
投票

您期望的文字形式不存在。只有整型和浮点文字具有模板形式;字符串和字符文字则不然。


0
投票

更新的版本可能是:

#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);
}
© www.soinside.com 2019 - 2024. All rights reserved.