I want to specialize following member function:
class foo {
template<typename T>
T get() const;
};
To other class bar
that depends on templates as well.
For example, I would like bar
to be std::pair
with some template parameters, something like that:
template<>
std::pair<T1,T2> foo::get() const
{
T1 x=...;
T2 y=...;
return std::pair<T1,T2>(x,y);
}
Where T1 and T2 are templates as well. How can this be done? As far as I know it should be possible.
So now I can call:
some_foo.get<std::pair<int,double> >();
The full/final answer:
template<typename T> struct traits;
class foo {
template<typename T>
T get() const
{
return traits<T>::get(*this);
}
};
template<typename T>
struct traits {
static T get(foo &f)
{
return f.get<T>();
}
};
template<typename T1,typename T2>
struct traits<std::pair<T1,T2> > {
static std::pair<T1,T2> get(foo &f)
{
T1 x=...;
T2 y=...;
return std::make_pair(x,y);
}
};
You can't partially specialize function templates, sorry but those are the rules. You can do something like:
and then call it like
though. You may have to do some messing around with
friend
ship or visibility ifget
really needed to be a member function.To elaborate on sbi's suggestion:
And now you're back to being able to say
You need to overload your member function for pair, like in
In the general case you will need to be able to disambiguate between the various overloads. In the case disambiguation is easy because pair is templated on 2 types while the original member was templated on T only.
If instead you needed a specialization for, e.g., std::vector, that is for a container with a single parameter template, you have to be careful since given it can be confusing for the compiler to understand if you wish to instantiate the template specialization where the template T is std::vector or the specialization for the overload,
Your proposed syntax cannot work since you are completely specializing the member function,
template <>
,but you are leaving out two unspecified types, T1 and T2.