Differentiate String Literal from Char Array

后端 未结 3 794
花落未央
花落未央 2020-12-16 10:55

I want to write some function that takes a string literal - and only a string literal:

template 
void foo(const char (&s         


        
3条回答
  •  清歌不尽
    2020-12-16 11:16

    You can use user-defined literals, that by definitions can only be applied to literals:

    #include 
    
    struct literal_wrapper
    {
        const char* const ptr;
    private:
        constexpr literal_wrapper(const char* p) : ptr(p) {}
        friend constexpr literal_wrapper operator "" _lw(const char* p, std::size_t);
    };
    constexpr literal_wrapper operator "" _lw(const char* p, std::size_t){ return literal_wrapper(p); }
    
    literal_wrapper f()
    {
        std::cout << "f()" << std::endl;
        return "test"_lw;
    }
    
    void foo(const literal_wrapper& lw)
    {
        std::cout << "foo:" << lw.ptr << " " << static_cast(lw.ptr) << std::endl;
    }
    
    int main()
    {
        auto x1 = f(), x2 = f(), x3 = f();
        const void* p1 = x1.ptr;
        const void* p2 = x2.ptr;
        const void* p3 = x3.ptr;
        std::cout << x1.ptr << " " << p1 << " " << p2 << " " << p3 << std::endl;
    
        foo(x1);
        foo(x2);
        foo("test"_lw);
        foo("test2"_lw);
    }
    

提交回复
热议问题