我希望有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_;
};
这需要很多样板代码。
我觉得可能有更好的方法。你会建议什么?
答案 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 ++并且非常欢迎提示,我以后需要使用这个要点