find 用下標而非迭代器)StdExt 的解決方案:將字符串拆分為常字符串 String (BasicString) 與字符串操作類 StringBuilder,參考 Java 設計哲學。
template <class _E>
class BasicString {
const _E* m_pszBuf; // 指向外部數據,不以 \0 結尾
size_t m_length; // 顯式長度
};
m_pszBuf 指向的數據m_length 決定,支持嵌入 \0 字符這看似反直覺,實則解鎖極致輕量操作:
vector、string、數組)可通過 cast() 瞬間轉為 String 視圖,無分配、無拷貝StringBuilder/TextPool)統一管理內存,符合現代 C++ 「所有權清晰」原則// 情況 1:外部緩衝區生命週期 ≥ String 對象(零拷貝借用)
BasicString(const value_type* pszVal, size_type cch);
// 情況 2:外部緩衝區臨時有效,需拷貝副本(由分配器 alloc 分配新內存)
template <class AllocT>
BasicString(AllocT& alloc, const value_type* pszVal, size_type cch);
刻意移除 BasicString(const value_type*),強制調用方聲明長度與所有權意圖,消除隱式轉換陷阱。
TempString 本質是「特殊生命週期的 String」,作為 BasicString 基類純屬實現便利。其構造函數每增加一種線性字符串支持(如 vector<char>),所有 BasicString 操作(compare、find、concat 等)自動獲得該類型支持——一個函數抵六個重載。
concat:異構字符串高效拼接std::String a = std::concat(alloc, "Hello", " ", "world", "!!!");
// 支持混合:std::string, char*, std::vector<char>, String, StringBuilder...
單次分配、按需拷貝,性能遠超鏈式 operator+。
BasicString 通過「不持有、不修改、不管理生命週期」的極簡契約,實現了常字符串的零開銷抽象,成為 StdExt 字符串體系的基石。