假设我们有一个带有非类型参数的模板函数,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++中使用编译时间字符串时遇到困难.
我决定采取看似无法使用的方法:使用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)
这有效并且说 …