【发布时间】:2010-12-22 00:56:14
【问题描述】:
C-Style 字符串可以用作模板参数吗?
我试过了:
template <char *str>
struct X
{
const char *GetString() const
{
return str;
}
};
int main()
{
X<"String"> x;
cout<<x.GetString();
}
虽然我没有收到关于类定义的任何抱怨,但实例化产生了 'X' : invalid expression as a template argument for 'str' (VC)。
【问题讨论】:
-
这个所谓的重复问题询问如何制作一个接受“构造函数中的两个参数”的模板类 - 他甚至没有说他希望字符串参数成为模板参数!这个问题要清晰得多,简单得多,提名重开。
-
关闭时我无法正确回答,但是(正如 Matt Bierner 指出的那样),较新的 GCC/clang 版本支持(奇怪的)非标准扩展,用于将字符串文字模板参数提供给用户-定义的文字(不是普通函数)。然后您可以将其转换为 char 数组,如下例所示:
template <typename Tchar, Tchar ...str> constexpr int operator"" _len() { const char str2[] = { str..., '\0' }; return c_strlen(str2); }其中 c_strlen 是 strlen 的 constexpr 版本:constexpr int c_strlen(const char* str) { return *str ? 1 + c_strlen(str + 1) : 0; } -
例如
constexpr int four = "four"_len;是 4。如果您只想对字符串进行编译时计算并返回一个值,这很方便。 AFAICT,您不能以这种方式将字符串文字哄骗到普通的模板参数中。可以编写像"hello!"_literal这样的UDL,它生成一个保存字符串的静态变量,但是在你从operator"" _literal返回它之后,编译器不再意识到const char*指向一个变量,所以它不会让您将其用作模板参数。这就是为什么马特的回答涉及一个时髦的tstring类型和一个decltype的技巧。