【问题标题】:Is there a way to determine if a parameter is a literal string? [duplicate]有没有办法确定参数是否是文字字符串? [复制]
【发布时间】:2013-09-20 02:53:58
【问题描述】:

我的问题是:

有没有办法判断参数是否为文字字符串?

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.

【问题讨论】:

  • 我想当它不满足 const char *&amp;&amp; 时,你可以让它失败,但这不仅适用于文字。我不知道你为什么想要这个功能。
  • @Shafik,文字字符串与 C 相关。
  • @xmllmx 文字字符串与 C 相关,但模板不相关。
  • @DyP 我什至没有想过要看起来......我的那些宏很丑......如果我考虑一下user define literals 可能是一个不错的选择,具体取决于用例。

标签: c++ string literals typetraits


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    没有办法检测字符串文字。可以检测到该参数是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");
    

    【讨论】:

    【解决方案3】:

    有没有办法判断一个参数是否是文字字符串?

    我不这么认为,一个字符串字面量是前置标记,并且会变成一个 const char 的数组,所以你将无法区分诸如数组是否来自字符串字面量。如果我们查看 C++ 草案标准部分 2.14.5 String literals 段落 8 说:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 2011-06-27
      • 2016-09-20
      • 1970-01-01
      相关资源
      最近更新 更多