在C语言中我们这样做
char buffer[100];
有没有一种方法来声明一个固定大小的 std::string
?
你可以像这样使用string::reserve方法
std::string s;
s.reserve(100);
但这并不是固定大小的,因为您可以使用string::push_back等方法向字符串中添加更多字符。
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);
请查看https://github.com/m3janitha/fixed_size_string。您可以将char buffer[n];
替换为fss::fixed_size_string<n> buffer;
你可以使用 std::array
,它是 C++ 中实现与 C 中相同功能的方法。
std::array<char, 100> buffer;
如果您担心由于大缓冲区大小而导致堆栈溢出(例如,如果那个100
是1'000'000
的替代品),则可以改为动态分配。
std::unique_ptr<std::array<char, 100>> buffer = std::make_unique<std::array<char, 100>>();
由于你的接口以char *
作为操作数,并且该对象允许您在运行时查询其大小,因此这应该足够。
void do_something(char * buffer, int buffer_sz);
的第三方函数,我决定使用std::string
并在需要时将其转换为 cstring。问题是buffer_sz
必须在编译时知道。所以我想知道是否有一种声明固定大小的std::string
的方法... - user3600124std::string
,但忽略允许你插入或删除字符的函数吗? - Nicol Bolas