[英]String type with max length
我需要實現一個類似於std:string
的C ++ 11或C ++ 14類型的STRING,但是具有以下附加約束/特性:
在所有其他方面,STRING應該像std::string
一樣運行並公開與std:string
相同的成員函數(例如.append()
等...)。
我的第一直覺是使用一個模板類STRING
,它包含一個std::string
,如下所示:
template<int WIDTH= 0, bool FIXED = false>
class STRING {
static_assert(WIDTH >= 0, "WIDTH of STRING cannot be negative.");
public:
STRING() : value{} { }
STRING(const std::string &s) { if (is_valid(s)) value = s; }
STRING(const char c[]) { if (is_valid(c)) value = c; }
STRING& operator=(const std::string& s){ if (is_valid(s)) value = s;}
operator std::string() const { return value; }
std::string value;
private:
bool is_valid(const std::string &s) {
if (WIDTH && s.length() > WIDTH)
throw std::length_error{"STRING assignment failed. STRING too long."};
if (FIXED && s.length() != WIDTH)
throw std::length_error{"STRING assignment failed. STRING has wrong length."};
return true;
}
};
但是,上面的STRING
模板類不公開std::string
成員函數,我不想重新實現整個std::basic_char
函數集,所以我認為我的方法根本就是錯誤的。 我懷疑在某種程度上擴展std::string
可能會更好,但是對標准庫類型的“混亂”似乎有點可怕。
我不確定這里最好的方法是什么,並且正確方向的指示將非常受歡迎。
完成此操作的最簡單方法是修改allocator模板參數。 請注意, std::string
是一種簡寫
std::basic_string<char, std::char_traits<char>, std::allocator<char>>
在分配器內部,您可以設置功能以檢查溢出或長度。
關於如何編寫自定義分配器的建議,請查看此問答 。 Howard Hinnant的網站上有一個關於如何限制復制需要的樣板的例子。
正如@rici所說,大多數實現都將使用短字符串優化(SSO)。 這意味着字符串類將有一個union
小基於堆棧的存儲的(典型地為24個字節左右)和三個指針到堆中。 這意味着對於小字符串,可能會完全忽略提供的分配器。 這實際上意味着您無法將字符串限制為非常小(低於SSO閾值)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.