c ++ оператор перегрузки << для std :: string - PullRequest
2 голосов
/ 19 декабря 2011

Я только сейчас вижу другой наивный код C ++, использующий sprintf для добавления встроенных команд C в массив символов, и я думаю, достаточно достаточно.

Я мог бы помочь с простыми, легкими, добавляющими и не форматирующими функциями для std::string, но, поскольку это будет включено в общий код команды, я хочу, чтобы он был идеальным, поэтому мне нужно немного совет по интерфейсу этой функции (т.е. не по фактической реализации).

Возможно следующее (я не проверял, это просто догадка):

  1. Перегрузка оператора "+=" (возможно, в другом пространстве имен, чем std или global)
  2. Перегрузка оператора "<<" (опять же, в другом пространстве имен)
  3. Предоставление неоператорных функций, не являющихся членами (я полагаю, снова в другом пространстве имен)
  4. Ещё одного простого решения я не видел?

Какими будут плюсы и минусы каждого решения (я предпочитаю «+=» или даже «<<»)?

Примечания

  • Дело не в форматировании. Если кто-то хочет форматировать, потоки C ++ хороши для этого. Я просто хочу добавить простой, легкий, один вызов оператора / функции.
  • Использование другого пространства имен может быть связано с тем, что мы не авторизованы для добавления кода в пространство имен std, и я не хочу загрязнять глобальное пространство имен, поэтому, да, я полагаю, пользователь должен будет добавить using namespace SomeNamespace ; как это сделано для <utility> s rel_ops пространства имен)
  • Я использую std::string , который изначально не способен обрабатывать другие типы, кроме себя, char и char *. Я хочу расширить это для обработки других простых типов.
  • Использование строкового потока слишком много весит в терминах кода (объявление потока, добавление, затем извлечение .str() для помещения его в строку и т. Д. И т. Д.), И последнее, что мне нужно, - это синтаксический подсластитель в строке функция, создающая поток строк при каждом вызове). Как вы можете видеть в приведенном ниже примере, решение для строкового потока слишком подробное :

.

// sprintf-like code with a char[] buffer:
sprintf(buffer, "%d", myDouble) ;

// stream-like code with a std::string buffer:
std::stringstream str ;
str << myDouble ;
buffer = str.str() ;

// example of desired code with a std::string buffer:
buffer += myDouble ;

Ответы [ 4 ]

3 голосов
/ 19 декабря 2011

C ++ 11 поставляется с перегруженным набором функций std :: to_string.

пример прототипа:

std::string to_string( int value );

Они могут быть изменены пользователем (в C +)+11).Вам сейчас понадобится ваше собственное пространство имен.

Вы можете реализовать свой собственный набор для типов по вашему выбору.Это сделало бы код на будущее.

вы бы использовали код как:

std::string s;
s+=std::to_string(1);
3 голосов
/ 19 декабря 2011
  1. А как насчет boost::format? Тогда вы можете написать:

    std::string first("world");
    std::string s = (boost::format("hello %1%") % first).str();
    
  2. Или создайте класс-оболочку, который вы можете использовать следующим образом:

    int i(2);
    std::string s = (Format() + "Hello " + first + " " + i).str();
    

    И Format() что-то вроде ( без повышения * ):

    class Format
    {
        public:
            template <typename T>
            Format &operator+(const T& v) {
                m_sstr << v; 
                return *this;
            };
            const std::string &str() const { return m_sstr.str(); };
        private:
            std::stringstream m_sstr;
    };
    
3 голосов
/ 19 декабря 2011

Я бы использовал ostringstream и потоковые манипуляторы для замены sprintf. Не стоит изобретать велосипед .

0 голосов
/ 19 декабря 2011

boost :: lexical_cast предоставляет вам потенциальную модель здесь - напишите функцию, которая может обрабатывать любые типы данных, которые вам нужны, превратите их в строку в соответствующем формате для ваших целей (и вы можете оптимизировать его столько, сколько вам нужно необходимо / можно) и вернуть их для использования с оператором + (строка, строка).

Специализируйте функцию по типу с обычной перегрузкой или специализацией шаблона в соответствии с вашими предпочтениями. lexical_cast использует шаблоны, так что он может обрабатывать абсолютно все, что бы ни определялись потоковые операторы, но ваш вариант использования гораздо более узкий, чем этот, и, таким образом, вы определенно можете добиться от него большей производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...