簡體   English   中英

具有最大長度的字符串類型

[英]String type with max length

我需要實現一個類似於std:string的C ++ 11或C ++ 14類型的STRING,但是具有以下附加約束/特性:

  1. 聲明期間指定的WIDTH參數。 如果STRING的長度大於WIDTH,則STRING將拋出異常
  2. 聲明期間指定的可選FIXED參數。 如果STRING的長度不等於WIDTH,則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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM