如何使长度约束std :: string?

时间:2016-03-15 17:56:00

标签: 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_;
};

这需要很多样板代码。

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

2 个答案:

答案 0 :(得分:2)

这很接近:

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混合。缺少的是添加或删除字符的操作。

答案 1 :(得分:1)

这是我基于其他答案的糟糕方法,几周前做过: https://gist.github.com/digitalist/a48a9a7edd5a105bafe5

使用自定义分配器,源代码中有stackoverflow答案的链接。

我还在学习C ++并且非常欢迎提示,我以后需要使用这个要点