【问题标题】:Like std::is_pointer and std::is_integral, how to implement std::is_cstring_pointer?像std::is_pointer和std::is_integral,如何实现std::is_cstring_pointer?
【发布时间】:2020-12-14 11:23:57
【问题描述】:

std::is_pointerstd::is_integral,如何实现std::is_cstring_pointer

我想检查指针是不是c类型的字符串指针,可以吗?

如何实现这个目标?

【问题讨论】:

  • 你尝试了什么?只需检查类型是否为char[n] 对于某些n
  • 需要考虑两件事:指针指向 char(s) 以及 char 数组是否以 0 结尾。据此:您想将什么视为 cstring_pointer ?
  • 为什么你需要一个实用函数呢? std::is_integral 很有用,因为有不同的数据类型是整数类型。对于 cstrings,你要么有 const char*,有什么要检查的?
  • @Eric 你也可以有一个非常量的char*,也可以有 volatile 限定的,尽管它们可能很少见。那是四种指向类型。并且指针本身可能是合格的,所以总共有 16 种类型。
  • 一般来说,没有办法知道任意指针是否指向有效的以 nul 结尾的字符数组。 char ch; const char* ptr = &ch;.

标签: c++ c++11 typetraits


【解决方案1】:

组合现有的类型特征相当简单:

template <class T>
struct is_char_ptr
    : std::integral_constant<bool,
        std::is_pointer_v<T>
        && std::is_same_v<char,
          typename std::remove_cv_t<std::remove_pointer_t<T>>>>
{};

请注意,指向 char 的指针可能指向以空字符结尾的字符串,也可能不指向。是否不影响类型。

【讨论】:

  • "请注意,指向 char 的指针可能指向以空字符结尾的字符串,也可能不指向。"那么我是否可以得出结论,没有办法知道char* 指针是否指向以null 结尾的字符串?
  • @John 根据类型,没有办法。
  • 能否请您推荐一些文件让我通过以完全理解这段代码sn-p?对我来说,这不是一个简单的代码 sn-p。
  • @John cppreference 在我看来相当不错。
  • 我明白了,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2017-05-31
  • 1970-01-01
相关资源
最近更新 更多