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>
I'd use cstdio instead of stdio.h. Actually, I'd use iostreams instead
of printf, but...
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");}
};
I'd use inheritance to work around this I think:
//is saying short legal here? I'm not sure...
template <int x, typename T, short y> class Base {
public:
void g() { printf("generic g()\n"); }
};
template <int x, typename T, short y> class B : public Base<x,T,y> {
public:
void f() {printf("generic f()\n");}
};
template <int x, short y> class B<x, float, y> : public Base<x, float, y> {
public:
void f() {printf("specialized f()\n");}
};
Quite where you choose to specialise, and where you chose to inherit
depends a bit on the actual problem in hand though obviously.
int main(void) {
B<1, int, 2> b;
b.f();
b.g();
B<1, float, 2> s;
s.f();
s.g();
}
Alan