Re: custom stream/streambuf issue
On Jul 17, 5:13 pm, Derek <ondr...@gmail.com> wrote:
I'm trying to create a generic multi-purpose istream class
that is capable of working in different ways based on
different file paths.
For example, say an istream-based class that can take a URL as
an open () parameter, and then use a filebuf to open a
"file://" path, a socketbuf to open an "http://" or
"telnet://" path, and an ftpbuf to open an "ftp://" path.
I already have some existing working specific purpose
istream-based classes, but I cannot seem to find a way to
build a generic one that can then interface with one of the
existing ones based upon the open path/url.
Part of the problem I am having is that an istream class must
contain a streambuf that is initialized with the constructor,
Where did you get this misinformation?
but I cannot seem to figure out how to build an istream class
that contains (or can contain) multiple different types of
streambufs, and be able to switch between them, but perhaps
this is the wrong approach.
Is there a way to make this work without having to cannibalize
all the existing istream-based classes?
There are several simple solutions. Perhaps the easiest is to
use a static member function to new the correct type of
streambuf, which is then passed to the base [io]stream.
Something like:
IUrlStream::IUrlStream(
std::string const& url )
: std::istream( createStreambuf( url ) )
{
}
(And don't forget to delete the streambuf in the destructor.)
Alternatively, you can use a filtering streambuf. You'll
probably want to in the end anyway, in order to easily insert a
filter to transcode whatever to and from UTF-8. Although in
this case, I'd probably only insert the filter when I finally
knew the encoding---don't forget that you can change the
streambuf on the fly, if you need to.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34