Строковый класс фиксированной длины C++?

Это воздействует на целое дерево процесса IIS, в противоположность просто Вашим пулам приложений.

C:\>iisreset /?

IISRESET.EXE (c) Microsoft Corp. 1998-1999

Usage:
iisreset [computername]

    /RESTART            Stop and then restart all Internet services.
    /START              Start all Internet services.
    /STOP               Stop all Internet services.
    /REBOOT             Reboot the computer.
    /REBOOTONERROR      Reboot the computer if an error occurs when starting,
                        stopping, or restarting Internet services.
    /NOFORCE            Do not forcefully terminate Internet services if
                        attempting to stop them gracefully fails.
    /TIMEOUT:val        Specify the timeout value ( in seconds ) to wait for
                        a successful stop of Internet services. On expiration
                        of this timeout the computer can be rebooted if
                        the /REBOOTONERROR parameter is specified.
                        The default value is 20s for restart, 60s for stop,
                        and 0s for reboot.
    /STATUS             Display the status of all Internet services.
    /ENABLE             Enable restarting of Internet Services
                        on the local system.
    /DISABLE            Disable restarting of Internet Services
                        on the local system.
11
задан Peter Mortensen 24 October 2009 в 19:38
поделиться

8 ответов

Почему бы не использовать std :: basic_string из STL как фиксированный строковый класс?

Вы можете использовать конструктор

basic_string(
   size_type _Count,
   value_type _Ch,
   const allocator_type& _Al = Allocator ( )
);

в качестве инициализатора.

Позднее редактирование: Пример:

std::string my10CharStringInitializedWithSpace( 10, ' ');
1
ответ дан 3 December 2019 в 04:52
поделиться

На сегодняшний день наиболее близким приближением является boost :: array

11
ответ дан 3 December 2019 в 04:52
поделиться

Используйте, например,

std::tr1::array<char, 10>
5
ответ дан 3 December 2019 в 04:52
поделиться

Стиль C массив символов?

char label[10] = "a string";
0
ответ дан 3 December 2019 в 04:52
поделиться

Вероятно, в boost есть что-то, что обеспечивает это (ближайший, который я лично видел, - Boost.Array, которого недостаточно). Однако, если вы просто хотите смоделировать «важное подмножество» std :: string , не очень сложно создать эквивалент фиксированной длины:

template <size_t N>
class fixed_string
{
    // ... interface looks like std::string
};

Для тех, кто спрашивает, зачем вообще нужно делать в общем, главное преимущество - избежать выделения памяти без потери большей части полезного std :: string API. Если есть другой способ сделать это с помощью std :: allocator , мне было бы интересно узнать.

1
ответ дан 3 December 2019 в 04:52
поделиться

Если я правильно вас понял, вы не хотите использовать std :: string , потому что боитесь, что он может незаметно распространиться на вас. Я вижу несколько вариантов:

  1. Использовать необработанную строку в стиле C и функции из cstdio , которые принимают аргумент длины (например, fgets ).

  2. Используйте a std :: vector .

0
ответ дан 3 December 2019 в 04:52
поделиться

Как насчет наследования std :: string в частном порядке, а затем раскрытия меньшего интерфейса с с использованием и написания собственных функций << и >>?

2
ответ дан 3 December 2019 в 04:52
поделиться

Я использовал что-то вроде этого для струн, выделенных на стеке или как часть другого объекта. Который в выброшении становится символом *

#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];
};
2
ответ дан 3 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: