Re: Partial template specialization for member
piwi ha scritto:
Hello, let's say I have this class:
template <typename A, typename B>
class Foo
{
void bar();
}
template <typename A, typename B>
void
Foo<A, B>::bar() {}
And I would like to have an implementation of the method partially
specialized, that is for only one of the two template parameters,
something in the spirit of:
template <char, typename B>
void
Foo<char, B>::bar() {}
Maybe you mean:
template <typename B>
void
Foo<char, B>::bar() {}
But obviously this doesn't work.
Any idea? Is it somewhat possible? Thanks,
This is kind of a FAQ. Naively speaking, you can't specialize a member
of a class template, because the member is *not* a template. (This is
not the end of the story, because even if you make it a member template
you wouldn't be allowed to partially specialize it the way you want...)
The easiest workaround is to have a function template there:
template <typename A, typename B>
class Foo;
template <typename A, typename B>
void bar_impl(Foo<A, B>& f);
template <typename A, typename B>
class Foo
{
void bar() { bar_impl(*this); }
};
then you can specialize bar_impl() at will. You might need to make
bar_impl() a friend of class Foo to let it access Foo members.
Another approach is to specialize the whole class. In order to avoid
duplicating code among the several specializations, you might want to
refactor common code in a base class:
template <typename A, typename B>
class FooBase
{
// code common to all Foo instances
// no bar() here
};
template <typename A, typename B>
class Foo : public FooBase<A, B>
{
void bar(); // generic implementation of bar()
};
template <typename B>
class Foo<char, B> : public FooBase<char, B>
{
void bar(); // specialized bar()
};
HTH,
Ganesh
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]