В чем причина такого дополнительного «более короткого» порядка, если сравнение черты возвращает 0?
Это просто, как basic_string::compare()
определяется .
И есть ли обходной путь или я должен свернуть свою собственную строку?
Кажется, что ваш пользовательский char_traits
должен реализовать:
length()
, возвращая длину обрезанной части строки, и
move()
и copy()
, для копирования этой обрезанной части
Однако существует потенциальная проблема, которая не может быть решена с помощью пользовательских черт.У basic_string
есть конструкторы, такие как basic_string(const CharT* s, size_type count, Allocator& alloc)
, или перегрузки методов, такие как assign
или compare
, которые принимают строку C и ее длину - в этих случаях Traits::length()
вызываться не будет.Если кто-либо использует один из этих методов, строка может содержать конечные пробелы или пытаться получить доступ к символам за концом исходной строки.
Чтобы решить эту проблему, можно сделать что-то вроде этого:
class TrimmedString
{
public:
// expose only "safe" methods:
void assign(const char* s) { m_str.assign(s); }
private:
std::basic_sttring<char, CustomTraits> m_str;
};
Или это (может быть проще):
class TrimmedString : private std::basic_string<char, CustomTraits>
{
public:
using BaseClass = std::basic_string<char, CustomTraits>; // for readability
// make "safe" method public
using BaseClass::length;
using BaseClass::size;
// etc.
// wrappers for methods with "unsafe" overloads
void assign(const char* s) { BaseClass::assign(s); }
};