Re: code duplication in template specialization
Christof Warlich wrote:
Hi,
I just need a specialization for only one member function of a
template class with _many_ members. Do I really have to duplicate the
source code for all the members, i.e. for those that do not need to
be specialized?
E.g. in the example below, I'd like to avoid to redefine member
B::g():
#include <stdio.h>
template<int x, typename T, short y> class B {
public:
void f(void) {printf("generic f()\n");}
void g(void) {printf("generic g()\n");}
};
// specialization for T == float
template<int x, short y> class B<x, float, y> {
public:
void f(void) {printf("specialized f()\n");}
void g(void) {printf("generic g()\n");}
};
int main(void) {
B<1, int, 2> b;
b.f();
b.g();
B<1, float, 2> s;
s.f();
s.g();
}
Since you're defining a partial specialisation, you cannot avoid
completely redefining the contents of the class template. You can
split the original template in two and only redefine the class
that contains the member you need ot specialise:
#include <stdio.h>
template<typename T> struct Bf {
void f() {printf("generic f()\n");}
};
template<int x, typename T, short y> class B : public Bf<T> {
public:
void g() {printf("generic g()\n");}
};
// specialization for T == float, but of 'Bf', not 'B'
template<> struct Bf<float> {
void f() {printf("specialized f()\n");}
};
int main() {
B<1, int, 2> b;
b.f();
b.g();
B<1, float, 2> s;
s.f();
s.g();
}
Or you could simply define B<float>::f, and not specialise it:
// replace the Bf<float> specialisation with
template<> void Bf<float>::f() {printf("specialized f()\n");}
since it's now a _full_ specialisation...
(and do drop the habit of putting 'void' inside parentheses, it's
a leftover from C, and isn't needed in C++).
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask