声明一个固定大小的字符串

Declaring a string of fixed size

本文关键字:字符串 一个 声明      更新时间:2023-10-16

在C语言中

char buffer[100];

是否有一种方法来声明固定大小的std::string

您可以像这样使用string::reserve方法

  std::string s;
  s.reserve(100);

但这不是固定大小,因为您可以使用string::push_back向字符串添加更多字符,例如

在c++17中,将有std::string_view提供与std::string相同的(不可变的)接口。

同时,你可以包装一个字符数组并添加任何你选择的服务,例如:

template<std::size_t N>
struct immutable_string
{
    using ref = const char (&)[N+1];
    constexpr immutable_string(ref s)
    : s(s)
    {}
    constexpr auto begin() const { return (const char*)s; }
    constexpr auto end() const { return begin() + size(); }
    constexpr std::size_t size() const { return N; }
    constexpr ref c_str() const { return s; }
    ref s;
    friend std::ostream& operator<<(std::ostream& os, immutable_string s)
    {
        return os.write(s.c_str(), s.size());
    }
};
template<std::size_t NL, std::size_t NR>
std::string operator+(immutable_string<NL> l, immutable_string<NR> r)
{
    std::string result;
    result.reserve(l.size() + r.size());
    result.assign(l.begin(), l.end());
    result.insert(result.end(), r.begin(), r.end());
    return result;
}
template<std::size_t N>
auto make_immutable_string(const char (&s) [N])
{
    return immutable_string<N-1>(s);
}
int main()
{
    auto x = make_immutable_string("hello, world");
    std::cout << x << std::endl;
    auto a = make_immutable_string("foo");
    auto b = make_immutable_string("bar");
    auto c = a + b;
    std::cout << c << std::endl;
}

我不知道你想做什么,但是用std::array<char, 100> buffer;你应该做得很好。

你可以得到一个像这样的字符串:

std::string str(std::begin(buffer),std::end(buffer);

从Boost 1.66开始:一个模拟std::basic_string接口的非分配字符串

检查https://github.com/m3janitha/fixed_size_string。你可以用fss::fixed_size_string<n> buffer;代替char buffer[n];

您可以使用std::array,这是一种c++方法,可以完全完成您在C中所做的工作。

std::array<char, 100> buffer;

如果您担心由于缓冲区大小过大而导致堆栈溢出(例如,如果1001'000'000的替代品),您可以动态分配它。

std::unique_ptr<std::array<char, 100>> buffer = std::make_unique<std::array<char, 100>>();

由于您的接口以char *作为其操作数,并且该对象允许您在运行时查询其大小,因此这应该足够了。

相关文章: