Re: [Re: [Re: [Re: [Re: [libxml++] UTF8 support]]]]



On Fri, Feb 28, 2003 at 05:36:31PM +0100, Murray Cumming Comneon com wrote:

> > > Class Node : public xmlpp::Node<Glib::ustring>
> > 
> > wouldn't this still require the full inclusion of the 
> > xmlpp:Node<> class template?
> 
> Yes, I guess people would still be using the inherited methods as templates
> unless we reimplemented them too.

Yes, and to instantiate an xmlpp_ustring::Node would require the full
definition of xmlpp::Node<...> (in order to know the size of the object)
which would require the template definition, i.e. the header

> > I think for this to work the 
> > underlying Node<Glib::ustring> would have to be hidden behind 
> > a "compiler firewall" using the pimpl idiom.
> 
> I'm not sure that pimpl is necessay. Just calling the templated methods from
> the untemplated derived methods would probably do it. But I haven't given it
> that much thought. Your way would certainly work, and is no worse really. 

Hmm, if I follow you, what object does the non-template class call those
methods on? It would have to be a member or a base class, but both of
those would require the full definition of the template class to be
visible. This is exactly what the pimpl is for; with the downside of
having to implement all methods twice, which as you say...

> Yes. Unpleasant.
> 
> > To make even more work, a similar wrapper could be done for 
> > other common params (e.g. QString) and included in the 
> > libxml++.a library, allowing users of other tmeplate 
> > instantiations to also drop in a new library without recompiling.
> 
> I think we would need separate libxml++_* libraries unless we want libxml++
> to depend on both glibmm and Qt.

Ah, yes. The library would then be:
A set of headers containing class templates, and ...
a set of headers and libraries for each specific instantiation.

*.h
xmlpp_glib/*.h  libxml++_glib.a  libxml++_glib.so
xmlpp_qt/*.h    libxml++_qt.a    libxml++_qt.so
xmlpp_xxx/*.h   libxml++_xxx.a   libxml++_xxx.so

Good thing I already had a headache before I started thinking about
this ;-)

> > > More importantly, I'm not sure whether our inheritance/polymorphism 
> > > would still work. Is Element<Glib::ustring> still an instance of 
> > > Node<Glib::ustring>?
> > 
> > yes:
> 
> Sorry, bad example. Yes, is probably would work for simple typedefs, but I
> don't think it would work for derived classes, such as your pimpl technique.

Should do:

class Node {
    void* pimpl;  // points at a Node<s>
};

class Element : public Node {
    void* pimpl;  // points at an Element<s> which has a Node<s> base
};

Apologies if I've still misunderstood.

jon

P.S. I've attached a tarball with a demo of this technique.
Un-tar and type "make" (or "gmake" on non-GNU systems)

-- 
I listen a lot and talk less. You can't learn anything when you're talking.
	- Bing Crosby

Attachment: pimpl.tar.gz
Description: application/tar-gz



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]