C++ 那里';s是strlen和wcslen,但是否有类似strlen的模板函数<;char>;或斯特伦<;wchar_t>;?

C++ 那里';s是strlen和wcslen,但是否有类似strlen的模板函数<;char>;或斯特伦<;wchar_t>;?,c++,C++,有一个strlen和一个wcslen函数,但是否有一个模板化字符数组长度函数,以便您可以执行类似于strlen或strlen的操作 如果没有,我想我会自己写 如果您使用的是模板,那么您不会使用std::string(当然是模板化的)?template size\t strlen(t*\u arg) { 如果(_arg==0) 返回-1; 尺寸i=0; 而(_arg[i]!=0)++i; 返回i; } 简单的答案是std::find,带有一个特殊的结束迭代器 什么都不匹配。(在模板中,您正在查找T

有一个strlen和一个wcslen函数,但是否有一个模板化字符数组长度函数,以便您可以执行类似于
strlen
strlen
的操作


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

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

template size\t strlen(t*\u arg)
{
如果(_arg==0)
返回-1;
尺寸i=0;
而(_arg[i]!=0)++i;
返回i;
}

简单的答案是std::find,带有一个特殊的结束迭代器 什么都不匹配。(在模板中,您正在查找T())

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

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


<>而不是写自己的,最好不要移到C++ STD::String?

< p>你有STD::String。p>
它提供了
char\u traits::length
char\u traits::length

显而易见的方法是让您的函数获取一个
basic\u字符串
,并让用户形成其中之一。然后所有长度的内容都隐藏在标准库中


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

谢谢您没有回答我的问题。不,这是为了写入基本流并允许用户传入字符数组缓冲区。@leetNightshade-这就是为什么没有通用的模板化C字符串std库的原因,但请随意编写自己的库。在这种情况下,您是必需的(我想)要在traits类中使用相应的函数。@leetNightshade-虽然它不是真正相关的,但iostream中的所有类模板都有两个模板参数,图表和traits。traits默认为char_traits,但将其用于char或wchar_t之外的任何内容都是未定义的行为。所以必须有人提供一个。根据表37中的定义。所有的iostream类都将使用它。如果你在Windows下工作,有很多_tcs*函数,但它是不同的(2011年你不应该在Windows中仍然为Ansi字符集编程)你有什么理由不写你自己的模糊重载吗?@Daniel发现我不需要写重载,只要看看下面的答案。我只是想使用这个标准,如果它存在的话,在这个过程中我发现了char_特征;如果我按照你说的去做,我就不会学到任何东西。你不想用模板特化来调用标准版本吗?它可能已经被特别优化了(几乎忘记了多词表示法)。你确定终止字符总是在WCARYTT上的‘0’(可以是在三元组中间)吗?(我不是)@Martin:如果出于任何原因将字符串存储在
vector
中,您可能需要此函数。当然
find
也可能很好。同样,这是在iWrite文件中使用的,它允许您编写基本字符串、图表类型*或大小为的void*。因此,如果我不想花时间创建正在从缓冲区中删除字符串。例如,缓冲区可能是通过网络连接创建的。
template <class T> size_t strlen( T * _arg )
{
  if ( _arg == 0 )
    return -1;
  size_t i = 0;
  while ( _arg[i] != 0 ) ++i;
  return i;
}