Re: Workaround for partial specialization wanted
on Fri Nov 02 2007, "Matthias Hofmann" <hofmann-AT-anvil-soft.com> wrote:
Hello everyone,
I need to port some code that uses partial specialization of class
templates
to a compiler that does not support the latter:
#include <cstddef>
#include <iostream>
// Extracts the type of an object.
template <class T>
struct extract { typedef T type; };
// Extracts the type of an array.
template <class T, std::size_t N>
struct extract<T[N]> { typedef T type; };
If your target is an old version of MSVC (6 or 7), then you can use
the Boost type traits for these kinds of things. They take advantage
of a bugfeature in the compiler that allows them to do this stuff.
// Primary template for object new.
template <class T> struct TrackNewHelper
{
static T* TrackNew( T* ptr, const char* file, int line)
{
std::cout << "Tracking object allocation" << std::endl;
return ptr;
}
};
// Partial specialization for array new.
template <class T, std::size_t N> struct TrackNewHelper<T[N]>
{
static T* TrackNew( T* ptr, const char* file, int line)
{
std::cout << "Tracking array allocation " << std::endl;
return ptr;
}
};
// Forwards the call to helper classes.
template <class T> typename extract<T>::type* TrackNew(
typename extract<T>::type* ptr, const char* file, int line )
{
return TrackNewHelper<T>::TrackNew( ptr, file, line );
}
This doesn't need partial specialization at all; just partial function
template ordering. Of course, your compiler probably doesn't support
that either, but here's a workaround (the extra trailing argument and
the ... help the compiler decide to call the right function).
T* TrackNew( T* ptr, const char* file, int line, ...)
{
std::cout << "Tracking object allocation" << std::endl;
return ptr;
};
template <class T, std::size_t N>
T(*)[N] TrackNew( T(*ptr)[N], const char* file, int line, int)
{
std::cout << "Tracking array allocation " << std::endl;
return ptr;
}
#define NEW( T ) TrackNew( new T, __FILE__, __LINE__, 0 )
Of course, I haven't tested this, so it may be buggy. And I haven't
tested it with your compiler, which is definitely not conforming, so
I don't know how well it will handle the above. If you have trouble
you might change the return type of the 2nd overload to T*.
Good luck,
--
Dave Abrahams
Boost Consulting
http://www.boost-consulting.com
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]