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

C++ 有没有办法确定参数是否为文字字符串?,c++,string,literals,typetraits,C++,String,Literals,Typetraits,我的问题是: 有没有办法确定参数是否为文字字符串? template<class T> bool IsLiteral(T arg) { // How to implement? } 模板 布尔岛(T参数) { //如何实施? } 或 模板 结构IsLiteral{enum{value=???};}; 因此,我们可以编写以下代码: char* p = "Hello"; assert(IsLiteral(p)); // fail. assert(IsLiteral("He

我的问题是:

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

template<class T>
bool IsLiteral(T arg)
{
    // How to implement?
}
模板
布尔岛(T参数)
{
//如何实施?
}

模板
结构IsLiteral{enum{value=???};};
因此,我们可以编写以下代码:

char* p = "Hello";

assert(IsLiteral(p)); // fail.
assert(IsLiteral("Hello")); // never fail.
assert(IsLiteral<decltype("Hello")>::value); // never fail.
char*p=“你好”;
断言(IsLiteral(p));//失败。
断言(IsLiteral(“Hello”);//永不失败。
断言(IsLiteral::value);//永不失败。

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

无法检测字符串文本。可以检测到的是,参数是一个固定大小的数组,其大小为
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;
}
有没有办法确定参数是否为文字字符串

我不这么认为,字符串文字是预处理标记,它将被转换为常量字符数组,因此您将无法区分这样的数组是否来自字符串文字。如果我们看C++草稿标准部分<代码> 2.145< /COD>字符串文字,第8段说:

普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文本的类型为“n const char数组”,其中n是下面定义的字符串大小,并且具有静态存储持续时间


我想当它不满足
const char*&&&
时,您可能会使它失败,但这不仅对文本成功。我不知道你为什么想要这个功能。@Shafik,文字字符串与C相关。@xmllmx文字字符串与C相关,但模板与C无关。另一个可能的重复:@DyP我甚至没想过要看。。。我的那些宏很难看。。。如果我考虑一下,它可能是一个很好的替代方案,具体取决于用例。我知道我已经;)
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");