我的问题是:
有没有办法确定参数是否是文字字符串?
template<class T>
bool IsLiteral(T arg)
{
// How to implement?
}
或
template<class T>
struct IsLiteral { enum { value = ??? }; };
这样我们就可以编写以下代码:
char* p = "Hello";
assert(IsLiteral(p)); // fail.
assert(IsLiteral("Hello")); // never fail.
assert(IsLiteral<decltype("Hello")>::value); // never fail.
答案 0 :(得分:0)
字符串文字是源代码术语。编译代码后,将其分配/加载到内存位置。使用其值的代码不关心或知道它是在运行时还是编译时创建的。
答案 1 :(得分:0)
无法检测字符串文字。可以检测到的是,参数是char const
的固定大小数组:
template <std::size_t N>
bool IsLiteral(char const (&)[N]) {
return true;
}
template <std::size_t N>
bool IsLiteral(char (&)[N]) {
return false;
}
template <typename T>
bool IsLiteral(T) {
return false;
}
我认为你不能区分这两种用途:
char const array[] = { 'a' };
IsLiteral(array);
IsLiteral("foo");
答案 2 :(得分:0)
有没有办法确定参数是否是文字字符串?
我不这么认为,字符串文字是预处理标记,并且将被转换为const char数组,因此您将无法区分数组是否来自字符串文字。如果我们查看C ++草案标准部分2.14.5
字符串文字段 8 说:
普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字具有类型“n const char数组”,其中n是下面定义的字符串大小,并且具有静态存储持续时间