Pergunta
Eu estou tentando criar um ostream c ++ por motivos educacionais. Meu teste será a criação de um ostream que age como um ofstream iria exceto em vez de escrever em um arquivo que iria escrever para um deque ou vector recipiente.
Solução
Como é para a educação, como você diz, eu vou te mostrar como eu faria uma coisinha. Caso contrário, stringstream
é realmente o caminho a percorrer.
Parece que você quer para criar uma implementação streambuf que, em seguida, escreve a um vector / deque. Algo como isto (copiar de outra resposta de mim que alvo um / dev / fluxo nulo ):
template<typename Ch, typename Traits = std::char_traits<Ch>,
typename Sequence = std::vector<Ch> >
struct basic_seqbuf : std::basic_streambuf<Ch, Traits> {
typedef std::basic_streambuf<Ch, Traits> base_type;
typedef typename base_type::int_type int_type;
typedef typename base_type::traits_type traits_type;
virtual int_type overflow(int_type ch) {
if(traits_type::eq_int_type(ch, traits_type::eof()))
return traits_type::eof();
c.push_back(traits_type::to_char_type(ch));
return ch;
}
Sequence const& get_sequence() const {
return c;
}
protected:
Sequence c;
};
// convenient typedefs
typedef basic_seqbuf<char> seqbuf;
typedef basic_seqbuf<wchar_t> wseqbuf;
Você pode usá-lo como este:
seqbuf s;
std::ostream os(&s);
os << "hello, i'm " << 22 << " years old" << std::endl;
std::vector<char> v = s.get_sequence();
Se você quiser ter um deque como seqüência, você pode fazê-lo:
typedef basic_seqbuf< char, char_traits<char>, std::deque<char> > dseq_buf;
Ou algo semelhante ... Bem, eu não testei ele. Mas talvez isso também é uma coisa boa - por isso, se ele ainda contém erros, você pode tentar corrigi-los.
Outras dicas
Use std :: stringstream
#include <iostream>
#include <sstream>
int main()
{
std::stringstream s;
s << "Plop" << 5;
std::cout << s.str();
}
Eu vou apenas observar que você não tem que escrever um ostream-como classe para isso. Você pode usar um adaptador para atingir o seu objetivo.
Por exemplo, este código lê de istream e insere cada elemento em um vetor:
vector<string> V;
copy(istream_iterator<string>(cin),
istream_iterator<string>(),
back_inserter(V));
Sem mais detalhes sobre o que você quer fazer é difícil ser muito específico, mas você não quer criar um novo ostream. O que você quer fazer é criar um novo tipo streambuf, e usar um ostream existente.
A coisa easyist a fazer é para herdar de std :: basic_filebuf <>, e sobrecarregar o sync () e transbordo () métodos para adicionar elementos de suas estruturas de dados.