有没有办法确定参数是否是文字字符串?

时间:2013-09-16 03:00:38

标签: c++ string literals typetraits

我的问题是:

有没有办法确定参数是否是文字字符串?

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.

3 个答案:

答案 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是下面定义的字符串大小,并且具有静态存储持续时间