0

我的问题是:

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

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.
4

3 回答 3

0
于 2013-09-16T03:16:52.200 回答
0

“字符串文字”是一个源代码术语。编译代码后,它会将其分配/加载到内存位置。使用它的值的代码并不关心或知道它是在运行时还是编译时创建的。

于 2013-09-16T03:04:09.210 回答
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");
于 2013-09-16T03:05:47.903 回答