Re: Alternative to virtual template function
jacob.h.page@gmail.com wrote:
Since some of my target platforms don't provide an STL implementation,
I decided to create interfaces mimicking nice modern container classes
as well as factory methods in IPlatform that create the objects. For
example (pardon my simplified examples):
template<class T> class IList
{
public:
virtual int getCount() = 0;
// etc
}
class IPlatform
{
public:
template<class T> virtual IList<T>* createList() = 0;
// etc
};
However, this is not allowed, since template members cannot be virtual!
More precisely, a class method that is a function template cannot be
declared virtual. And that restriction should not be all that
surprising when one considers that a virtual method and a function
template are, as programming techniques, pretty much polar opposites. A
function template can create multiple routines from just one
implementation, whereas a virtual method can create multiple
implementations of just one routine.
So I ditched the member function idea and went the route of
regular-old functions instead:
In a platform-independent header:
template<class T> IList<T>* createList();
I'm not clear why the getList method itself has to be a template,
instead of its class, IPlatform.
In a platform-specific header:
template<class T> StlListAdapter : public IList<T>
{
public:
// blah, blah
};
It seems to me that making the class a template would at least make it
possible to declare a virtual method. There is no restriction against a
class template from declaring virtual, non-template function methods:
template <class T>
class IPlatform
{
public:
virtual IList<T> * createList()
{
}
...
};
At this point, I don't have enough of an understanding of the problem
domain to suggest other solutions, or even to able to form an opinion
one way or the other whether a class template with a virtual method is
a reasonable solution.
Greg
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]