如@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;
};