Template specialization help

A

Adrian

I am trying to write a specialized version of print that will
automagically work out that the container is a pointer of containers and
does a double ref on each iterator.

It feels possible but I cannot think of a way to do it. My initial
thoughts where to use the STL contains ::value_type and ::const_pointer
typedefs

Happy to modify template params to pass enough information

Anyone done this, or got any ideas on how

Thanks

TIA

Adrian


#include <iostream>
#include <vector>

template<class T>
void print(T first, T last)
{
for(T i=first; i!=last; ++i)
std::cout << (*i) << std::endl;
}

#if 0
template<>
void print(T first, T last)
{
for(T i=first; i!=last; ++i)
std::cout << (**i) << std::endl;
}
#endif
int main(int argc, char *argv[])
{
std::vector<int> intlist;
std::vector<int*> intptrlist;

for(int i=0; i<10; ++i)
{
intlist.push_back(i);
intptrlist.push_back(new int(i));
}

print(intlist.begin(), intlist.end());
print(intptrlist.begin(), intptrlist.end());

return 0;
}
 
I

Ian Collins

I am trying to write a specialized version of print that will
automagically work out that the container is a pointer of containers and
does a double ref on each iterator.

It feels possible but I cannot think of a way to do it. My initial
thoughts where to use the STL contains ::value_type and ::const_pointer
typedefs

Happy to modify template params to pass enough information

Anyone done this, or got any ideas on how

Um, I'm sure there's a cleaner way, but these work for ordered and
unordered containers:

template <typename T,
template <typename E,
typename A = std::allocator<E> > class Container>
void print( const Container<T>& c )
{
for( typename Container<T>::const_iterator i = c.begin(); i !=
c.end(); ++i )
std::cout << *i << std::endl;
}

template <typename T,
template <typename E,
typename L = std::less<E>,
typename A = std::allocator<E> > class Container>
void print( const Container<T>& c )
{
for( typename Container<T>::const_iterator i = c.begin(); i !=
c.end(); ++i )
std::cout << *i << std::endl;
}

template <typename T,
template <typename E,
typename A = std::allocator<E> > class Container>
void print( const Container<T*>& c )
{
for( typename Container<T*>::const_iterator i = c.begin(); i !=
c.end(); ++i )
std::cout << **i << std::endl;
}

template <typename T,
template <typename E,
typename L = std::less<E>,
typename A = std::allocator<E> > class Container>
void print( const Container<T*>& c )
{
for( typename Container<T*>::const_iterator i = c.begin(); i !=
c.end(); ++i )
std::cout << **i << std::endl;
}

The horrible template template syntax will be much cleaner in C++0x.
int main(int argc, char *argv[])
{
std::vector<int> intlist;
std::vector<int*> intptrlist;

for(int i=0; i<10; ++i)
{
intlist.push_back(i);
intptrlist.push_back(new int(i));
}

print(intlist.begin(), intlist.end());
print(intptrlist.begin(), intptrlist.end());

return 0;
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top