2016-04-20 8 views
6

Jeśli używam tego kodu:Uzyskanie ostatni znak w stringstream bez kopiowania cały jego bufor

template <typename Streamable> 
/* ... */ 
std::stringstream ss; 
ss << function_yielding_a_Streamable(); 
auto last_char = ss.str().back(); 

następnie (wierzę) kopię napisu w buforze ss „s będą musiały być tworzone tylko dla mnie, aby uzyskać ostatnią postać, a następnie zostanie zniszczona. Czy mogę zamiast tego zrobić coś lepszego? Być może używając metody seekp()?

+1

Dlaczego należy położyć 'string' do' stringstream' w pierwszej kolejności? – Sean

+0

@Sean: Fair question, patrz edit. – einpoklum

+0

Przypuszczalnie nie * ma * być "stringstream"? Być może zamiast tego możesz użyć strumienia niestandardowego. – user2079303

Odpowiedz

6

Można zrobić coś takiego:

char last_char; 
std::stringstream ss; 
ss << function_yielding_a_Streamable(); 
ss.seekg(-1,ios::end);//get to the last character in the buffer 
ss>>last_char; 
+0

Czy nie powinienem wtedy również zwrócić się z powrotem (np. Jeśli zawinę to w funkcję zajmującą się ostringstreamem i chcę działać czysto)? – einpoklum

+0

@einpoklum Przepraszam za późną powtórkę, wierzę, że możesz to zrobić za pomocą * seekp (0) *, aby rozpocząć od początku do wstawienia. Przypuszczam, że miałeś zamiar powiedzieć: * stringstream & * zamiast * ostringstream & *, ponieważ z tym ostatnim nie można uzyskać dostępu do operatora * ekstrakcji * *, aby odczytać ostatni znak. –

Powiązane problemy