相关疑难解决方法(0)

一些const char*在编译时不可用?

假设我们有一个带有非类型参数的模板函数,const char *如下所示:

template <const char * MESSAGE> void print() {
    std::cout << MESSAGE << '\n';
}
Run Code Online (Sandbox Code Playgroud)

使用此模板不会像日志那样成为MESSAGE可以在编译时推断出来的问题,因此以下用法是合法的:

namespace {
    char namespace_message[] = "Anonymous Namespace Message";
    constexpr char namespace_constexpr_message[] = "Anonymous Namespace Constexpr Message";
}

char message[] = "Message";
constexpr char constexpr_message[] = "Constexpr Message";

int main()
{
    print<namespace_message>();
    print<namespace_constexpr_message>();

    print<message>();
    print<constexpr_message>();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但下面的那些不是(见这里):

namespace {
const char namespace_const_message[] = "Anonymous Namespace Const Message";
}

const char const_message[] = "Const Message";

int …
Run Code Online (Sandbox Code Playgroud)

c++ string templates string-literals compile-time

19
推荐指数
1
解决办法
2344
查看次数

Constexpr强制转换为const char []

它发生在很多人身上,它发生在我身上.我在C++中使用编译时间字符串时遇到困难.

我决定采取看似无法使用的方法:使用template <char...>类.

这就是我提出的,它是非常常见的,没什么特别的,它也不起作用.

template <char... chars> class string
{
public:

    static constexpr const char value[] = {chars...};

    constexpr string()
    {
    }

    constexpr operator decltype(value) & () const
    {
        return value;
    }
};

template <char... chars> constexpr const char string <chars...> :: value[];
Run Code Online (Sandbox Code Playgroud)

我的想法是使一个string实例可constexpr构造并暴露某种constexpr转换,以便它提供其内容.

现在,如果我这样做

static constexpr const char x[] = "ciao";

template <const char * str> void print()
{
    std :: cout << str << std :: endl;
}

print <x> ();
Run Code Online (Sandbox Code Playgroud)

这有效并且说 …

c++ templates char constexpr

7
推荐指数
1
解决办法
799
查看次数