Диспетчер по типу резольвера, как показывает @Nawaz, ИМХО - лучший способ.Другой вариант - переместить реальную реализацию этой функции за пределы класса, внутри собственной структуры, сделать ее статической и частично специализировать структуру.В классе, назовите это.Конечно, если он обращается к закрытым частям myClass
, вам нужно сделать его friend
:
template<class A, class B, class C>
class myClass;
template<class A, class B, class C>
struct myClassFuncs{
typedef myClass<A,B,C> class_type;
static void myFunc(class_type* self){
// generic for everything ...
}
};
template<class A, class B>
struct myClassFuncs<A,B,int>{
typedef myClass<A,B,int> class_type;
static void myFunc(class_type* self){
// specialized on C == int ...
}
};
// and so on ...
template<class A, class B, class C>
class myClass{
typedef myClassFuncs<A,B,C> func_holder;
friend class func_holder;
public:
void myFunc(){
func_holder::myFunc(this);
}
};
Хотя это приводит к множеству обёрток в классе и специализированных версиях ...
Другая идея, которую можно назвать довольно сумасшедшей, состоит в том, чтобы не иметь функций в классе, а функторов.Те становятся специализированными, а затем звонят.Это более многословно, но дает лучший доступ к тем функциям, которые вы хотите специализировать.Хотя, если они хотят получить доступ к частным частям, вам нужно сделать их всех друзьями.: /
template<class A, class B, class C>
class myClass;
template<class A, class B, class C>
class myClass_myFunc{
typedef myClass<A,B,C> class_type;
class_type* const _self;
public:
myClass_myFunc(class_type* self)
: _self(self)
{}
void operator() const{
// generic logic here
}
};
template<class A, class B>
class myClass_myFunc<A,B,int>{
typedef myClass<A,B,int> class_type;
class_type* const _self;
public:
myClass_myFunc(class_type* self)
: _self(self)
{}
void operator() const{
// specialized logic here
}
};
template<class A, class B, class C>
class myClass{
friend class myClass_myFunc<A,B,C>;
public:
myClass()
: myFunc(this)
{}
const myClass_myFunc<A,B,C> myFunc;
};