Да, вы можете. Но вам нужно изменить структуру вызова, но чуть-чуть.
В частности, используйте шаблон стратегии для реструктуризации реализации функции-члена как класса (который разрешен быть специализированным).
Это разрешено, если класс стратегии не является вложенным (и, следовательно, не зависит от неспециализированного типа шаблона).
например. (это, вероятно, не является синтаксически правильным, но идея должна быть ясной)
template <class T>
class OuterThingThatIsNotSpecialized
{
template <class U>
void memberWeWantToSpecialize(const U& someObj_)
{
SpecializedStrategy<U>::doStuff(someObj_);
}
};
template <class U>
struct SpecializedStrategy;
template <>
SpecializedStrategy<int>
{
void doStuff(const int&)
{
// int impl
}
};
template <>
SpecializedStrategy<SomeOtherType>
{
void doStuff(const SomeOtherType&)
{
// SOT impl
}
};
Это невероятно полезно, потому что вызовы OuterThingThatIsNotSpecialized для типов, где не существует реализации, просто не смогут скомпилироваться.
PS. Вы даже можете использовать эту стратегию для частичной специализации шаблонных функций, что в противном случае невозможно в C ++.