Ответ 1
Ближайшее приближение сегодня boost::array<char, 10>
Есть ли что-нибудь подобное в стандартном С++/STL? В идеале он должен быть построен как
fstring s = fstring(10);
Мне иногда нужно построить или иметь строку фиксированного размера. Иногда, чтобы иметь возможность читать/писать только то, что много символов в поток.
Edit:
Обратите внимание, что размер известен только во время выполнения и отличается от одного к другому. Но все fstring
должны знать, как работать вместе и иметь все фантазии string
.
Ближайшее приближение сегодня boost::array<char, 10>
Использовать, например.
std::tr1::array<char, 10>
Как насчет наследования std::string
конфиденциально, а затем выставляя меньший интерфейс с помощью using
и записывая собственный < и → функции?
Почему бы не использовать std:: basic_string из STL в качестве фиксированного класса строк?
Вы можете использовать конструктор
basic_string(
size_type _Count,
value_type _Ch,
const allocator_type& _Al = Allocator ( )
);
в качестве инициализатора.
Редактировать позже: Пример:
std::string my10CharStringInitializedWithSpace( 10, ' ');
Вероятно, что-то в boost, которое обеспечивает это (ближайший я лично видел Boost.Array, которого недостаточно). Однако, если вы просто хотите моделировать "важное подмножество" std::string
, сделать не эквивалент фиксированной длины не очень сложно:
template <size_t N>
class fixed_string
{
// ... interface looks like std::string
};
Для всех, кто спрашивает о том, зачем вообще этого делать, основное преимущество заключается в том, чтобы избежать выделения памяти, не теряя большую часть полезного API std::string
. Если есть другой способ сделать это с помощью std::allocator
, мне было бы интересно узнать.
Я использовал что-то подобное для строк, выделенных в стеке или как часть другого объекта. Что в релизе становится char *
#ifdef DEBUG
#define STR_DEBUG
#endif
#define FIXED_STRING( maxSize ) ReservedString<maxSize> _Tmp##__LINE__;
class FixedString{
public:
FixedString& operator =( char const * const pStr );
//FixedString& operator =( FixedString const &pStr );
operator const char*() const { return mStr; }
const char* cStr() const { return mStr; }
FixedString& operator +=(const char *pStr);
bool equals( const char *pStr );
bool beginsWith( const char *pStr );
/// rises ASSERT if not enough
void ensureEnoughForNMore( int NMoreSymbols );
protected:
char *mStr;
#ifdef STR_DEBUG
ui16 mMaxLength;
#endif
private:
#ifdef STR_DEBUG
FixedString( char *str, ui16 maxLength ): mStr(str), mMaxLength(maxLength) {}
#else
FixedString( char *str ): mStr(str) {}
#endif
template<int>
friend class ReservedString;
};
template <int MAX_LENGTH> class ReservedString{
public:
operator FixedString() {
#ifdef STR_DEBUG
return FixedString( mBuf, MAX_LENGTH );
#else
return FixedString( mBuf );
#endif
}
private:
char mBuf[MAX_LENGTH+1];
};
С С++ 11 можно перейти на
std::array<char,10> s;
Также эквивалент std::string всегда можно построить, когда требуется
std::string s2(std::begin(s), std::end(s));
Символьный массив стиля С.
char label[10] = "a string";
Если я правильно вас понимаю, вы не хотите использовать std::string
, потому что вы беспокоитесь, что он может бесшумно расширяться. Я вижу пару вариантов:
Используйте строчную строку C-стиля и функции из cstdio
, которые принимают аргумент длины (например, fgets
).
Используйте std::vector<char>
.