Потоковый объект, который обрабатывает числа

Это может быть очень простой вопрос, но, просматривая ссылку на STL, я не могу найти ничего подходящего. В качестве примера

std::ostringstream oss;
oss << "One hundred and one: " << 101;

приведет к One hundred and one: 101 Хранится в oss, означает числовое значение 101 преобразуется в текст. То, что я ищу, это объект потока, который сохраняет числовое значение, так что-то вроде:

numstream nums;
nums << 10 << 0 << 15;

приведет к байтовому или строковому буферу, не содержащему текстового представления 10, 0 а также 15 но только эти три числа.

Есть идеи, что можно использовать для этого?

2

Решение

Буфер, содержащий последовательность целых чисел std::vector<int>
управления.

Вы можете переопределить глобальный оператор << добавить
любой тип T к любому типу контейнера C для которого такая операция
смысл:

#include <vector>
#include <iostream>

std::vector<int> & operator<<(std::vector<int> & vi, int i)
{
vi.push_back(i);
return vi;
}

int main()
{
std::vector<int> vi;
vi << 1 << 2 << 3;
for(auto i : vi) {
std::cout << i << std::endl;
}
return 0;
}

Однако если все Вы хотите достичь, это сокращение, например,

si.push_back(i);

для некоторой целочисленной последовательности si и инт iи чтобы иметь возможность сократить, например,

si.push_back(i);
si.push_back(j);
si.push_back(k);

чтобы:

si << i << j << k;

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

Я предлагаю сократить si.push_back(i) в si << i не стоит
и что если вы хотите получить утомительно длинные последовательности push_back(n) на
одна строка, то было бы достаточно и менее эксцентрично определить
шаблонно-безопасный шаблон переменной функции для этой цели, например,

void push_back(std::vector<int> & vi){}

template<typename ...Ts>
void push_back(std::vector<int> & vi, int i, Ts... ts)
{
vi.push_back(i);
if (sizeof...(Ts)) {
push_back(vi,ts...);
}
}

С которой вы бы написали, например

push_back(si,i,j,k);

скорее, чем:

si << i << j << k;
1

Другие решения

С этой семантикой (вставка потока): нет, нет.

Из вашего примера похоже, что вы хотите заполнить вектор целых чисел.

Вам понадобится функтор (манипулятор ostream), который переведет семантику, подобную ostream, в сложение вектора-элемента.

Что-то вроде:

struct functor {
functor(std::vector<int>& viref):
myVector(viref)
{}
// this operator overload translates stream-insert operator
// into vector element addition
functor& operator<<(const int i) {
myVector.push_back(i);
return *this;
}
std::vector<int>& myVector;
};

int main() {
std::vector<int>   vi;
functor            f( vi );

f << 1 << 2 << 3;
}

В качестве альтернативы, вы всегда можете написать свой собственный класс streambuffer (http://www.cplusplus.com/reference/streambuf/streambuf/) но я сомневаюсь, что это пойдет очень хорошо, потому что весь механизм buf-строки / потока действительно предназначен для работы с отдельными символами, которые вставляются / удаляются.

0

По вопросам рекламы [email protected]