【问题标题】:There's a strlen, and a wcslen, but is there a template function like strlen<char> or strlen<wchar_t>?有一个 strlen 和一个 wcslen,但是否有类似 strlen<char> 或 strlen<wchar_t> 的模板函数?
【发布时间】:2011-03-31 17:42:27
【问题描述】:

有一个 strlen 和一个 wcslen 函数,但是否有一个模板字符数组长度函数,以便您可以执行类似 strlen&lt;char&gt;strlen&lt;wchar_t&gt; 之类的操作?

如果没有,那我想我会自己写。

【问题讨论】:

  • 如果你在 Windows 下工作,有很多 _tcs* 函数,但它有些不同(在 2011 年你不应该仍然在 Windows 中为 Ansi 字符集编程)
  • 你有什么理由不为此编写自己的模棱两可的重载?
  • @Daniel 原来我不需要写重载,看看下面的答案。我只是想使用该标准(如果存在),并且在此过程中我发现了 char_traits 功能;如果我按照你说的去做,我什么也学不会。

标签: c++


【解决方案1】:

你有 std::string 使用的 char_traits 助手。

它提供char_traits&lt;char&gt;::lengthchar_traits&lt;wchar_t&gt;::length

【讨论】:

    【解决方案2】:

    如果您使用模板,您不会使用 std::string (当然是模板化的)?

    【讨论】:

    • 感谢您没有回答我的问题。不,这是用于写入 basic_ofstream 并允许人员传入字符数组缓冲区。
    • @leetNightshade - 这就是没有通用模板化 C 字符串标准库的原因,但可以随意编写自己的
    • 在这种情况下,你需要(我认为)使用traits类中的相应函数。
    • @leetNightshade - stackoverflow.com/questions/5319770/… 虽然这并不重要
    • iostream 中的所有类模板都采用两个模板参数,charT 和一个特征。特征默认为 char_traits,但将其用于除 char 或 wchar_t 之外的任何内容都是未定义的行为。所以必须有人提供。根据表 37 中的定义。所有的 iostream 类都将使用它。
    【解决方案3】:
    template <class T> size_t strlen( T * _arg )
    {
      if ( _arg == 0 )
        return -1;
      size_t i = 0;
      while ( _arg[i] != 0 ) ++i;
      return i;
    }
    

    【讨论】:

    • 你不想使用模板专业化来调用可能已经特别优化的标准版本吗(几乎忘记了多词表示你确定终止字符总是'\ 0'在 wchar_t (即它可能在三胞胎中间)?(我不是)。
    • @Martin:如果您出于任何原因将字符串存储在vector 中,您可能需要此功能。当然find也可能不错。
    【解决方案4】:

    简单的答案是 std::find,带有一个特殊的结束迭代器 从不匹配任何东西。 (在模板中,您正在寻找 T()。)

    【讨论】:

      【解决方案5】:

      没有。

      这是因为 strlen() 和 wcslen() 是 C(不是 C++)的一部分,因此可以处理 C 字符串。

      C++ 通过提供 std::string (std::wstring) 不鼓励使用 C 字符串。这些当然是 (std::basic_string) 的模板。

      改用 C++ std::string 不是自己写更好吗?

      【讨论】:

      • 再一次,这是在 IWriteFile 内部使用的,它允许您编写一个 basic_string、一个 CharType* 或一个带大小的 void*。因此,如果我不想花时间从缓冲区创建字符串,我需要第二个选项。例如,缓冲区可能是从网络连接创建的。
      【解决方案6】:

      显而易见的方法是让您的函数采用basic_string&lt;CharType&gt; 并让用户形成其中之一。然后所有长度的东西都隐藏在标准库中。

      如果这不合适,只需在将字符数复制到流的内部缓冲区时跟踪它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 2022-01-04
        • 2012-11-10
        • 1970-01-01
        • 2013-01-09
        相关资源
        最近更新 更多