Re: template specialization
mqrk wrote:
The simplest (and probably the best) solution is like this:
The problem still remains:
template <typename T> struct Container< T, std::set >
{
std::set<T> data;
};
template <typename T> struct Container< T, std::list >
{
std::list<T> data;
};
These are specializations, and one needs to write a primary template.
However, std::set template has three parameters: set<Key, Compare,
Alloc>, and std::list has only two: list<Type, Alloc>
Thus, if the primary template is
template < typename, template < typename, typename, typename > class >
class Container;
then the second specialization yields an error ("error C3201: the
template parameter list for class template 'std::list' does not match
the template parameter list for template parameter ...")
and if the primary template is
template < typename T, template<typename, typename> class >
class Container;
then the "set" template yields an error, and "list" works fine.
The same problem is in the solution with policies: the line
template <typename> class Container
in
template < typename T,
template <typename> class Container,
template <class > class AccessPolicy = DefaultAccessPolicy >
class MyContainer
will match neither std::set nor std::list for the same reason; adding
more arguments, e.g. template <typename,typename> class Container breaks
generality.
Is there a mechanism to reconcile these two? (E.g. something like
var-arg template arguments...)
Konstantin.