c++ - 如何限制 std::string 的长度?

标签 c++ string c++11 size string-length

我想要一个像 std::string 的类(例如 string_n),这样 string_n 的对象不能超过N 个字符长。

N 可以在编译时指定。尝试创建更大长度的 string_n 可能会断言或引发异常。

一个选项类似于以下内容,但它会错过std::string提供的所有不错的成员函数。

template <size_t N>
class string_n {
  char char_[N + 1];
};

另一种选择是推出如下所示的新类。

template <size_t N>
class string_n {
  public:
    // constructor and assignment operators with length check

    ~string_n() = default;

    // for readers
    const string& get() const;

  private:
    std::string string_;
};

这需要大量样板代码。

我感觉可能有更好的方法。你有什么建议?

最佳答案

这很接近:

template<size_t N, class CharT, class Traits = std::char_traits<CharT>>
struct basic_string_n:
  std::array<CharT, N>,
  std::experimental::basic_string_view<CharT, Traits>
{
  using storage = std::array<CharT, N>;
  using access = std::experimental::basic_string_view<CharT, Traits>;
  using storage::operator[];
  using storage::data;
  using access::size;

  basic_string_n(basic_string_n const& o):
    storage(o),
    access(regen(*this))
  {}
  basic_string_n& operator=(basic_string_n const& o)
  {
    *this = (storage const&)o;
    *this = regen(*this);
    return *this;
  }
  void remove_prefix(std::size_t n) = delete;
  void remove_suffix(std::size_t n) = delete;
  void swap( basic_string_n& other ) {
    using std::swap;
    swap( (storage&)*this, (storage&)other );
    *this = regen(*this);
    other = regen(other);
  }
private:
  friend access regen(storage& self) {
    return {self.data(), CharT::length(self.data())};
  }
};

这里我们将字符数组与 std::experimental::basic_string_view 混合在一起。缺少的是添加或删除字符的操作。

关于c++ - 如何限制 std::string 的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36018659/

相关文章:

c++ - 二进制数据注入(inject)字符串

c++ - 按值捕获成员变量

c++ - 无法将完美转发添加到包装函数

c++ - 通过指针打印矩阵

c++ - 使用 g++ 在 AIX 上编译 pthread.h 东西

Qt C++11 lambda : Is this connect (signal-slot) correct?

c++ - 字符串文字的模板参数推导

c++ - 我如何使用 cryptimportkey 函数导入私钥来加密数据相同的结果使用导入的 key

javascript - 如何在 JavaScript 中从字符串中提取数字?

c - 将字符串地址作为参数传递给指向 Char 函数的指针的指针