我正在做很多解析/处理,其中给出了前导/尾随空格和不区分大小写。所以我为std::basic_string
(见下文)制作了一个基本的 char 特征,以节省一些工作。
特征不起作用,问题是basic_string
' 比较调用特征比较,如果评估为 0,则返回大小差异。在basic_string.h
它说...如果比较的结果是非零返回它,否则较短的先排序。看起来他们明确地不希望我这样做......
如果 trait 的比较返回 0 ,那么为什么会有这个额外的“较短”排序?而且,是否有任何解决方法或者我必须自己滚动字符串?
#include <cstring>
#include <iostream>
namespace csi{
template<typename T>
struct char_traits : std::char_traits<T>
{
static int compare(T const*s1, T const*s2, size_t n){
size_t n1(n);
while(n1>0&&std::isspace(*s1))
++s1, --n1;
while(n1>0&&std::isspace(s1[n1-1]))
--n1;
size_t n2(n);
while(n2>0&&std::isspace(*s2))
++s2, --n2;
while(n2>0&&std::isspace(s2[n2-1]))
--n2;
return strncasecmp(static_cast<char const*>(s1),
static_cast<char const*>(s2),
std::min(n1,n2));
}
};
using string = std::basic_string<char,char_traits<char>>;
}
int main()
{
using namespace csi;
string s1 = "hello";
string s2 = " HElLo ";
std::cout << std::boolalpha
<< "s1==s2" << " " << (s1==s2) << std::endl;
}