我对C ++中的模板专业化有疑问,我希望有人可以提供帮助。我有一个有3个模板参数的类:
template<class A, class B, class C>
class myClass {
public:
void myFunc();
};
我想要做的是编写几个版本的myFunc,专门用于比如C,但是对于类型A和B是通用的。所以我不想要像这样的完全模板化的函数:
template<class A, class B, class C>
void myClass<A, B, C>::myFunc()
{
// function code here
}
我不想要像这样的完全专业化的功能
void myClass<int, int, int>::myFunc()
{
// code goes here
}
相反,我想做一些类似于
的事情template<class A, class B>
void myClass<A, B, int>::myFunc()
{
// code goes here
}
这个想法是,如果类类型C是int,我会调用一个版本的myFunc(),如果类类型C是double,我会调用另一个版本的myFunc。我已经尝试了很多模板特化语法的差异组合(这里列出的太多了),似乎没有编译。
有人可能会指出我在正确的方向吗?在此先感谢您的帮助。
迈克尔
答案 0 :(得分:6)
您可以编写一个函数模板和一个重载,并将工作委托给它:
template<class A, class B, class C>
class myClass
{
//resolver doesn't need to define anything in it!
template<class> struct resolver {}; //empty, yet powerful!
public:
void myFunc()
{
doFun(resolver<C>());
}
//this is a function template
template<typename X>
void doFun(const resolver<X> & )
{
//this function will get executed when C is other than int
//so write your code here, for the general case
}
//this is an overload, not a specialization of the above function template!
void doFun(const resolver<int> & )
{
//this function will get executed when C = int
//so write your code here, for the special case when C = int
}
};
请注意一点:doFun(const resolve<int>& )
是一个重载函数,它不是函数模板的特化。您不能专门化成员函数模板而不专门化封闭类模板。
阅读这些文章:
答案 1 :(得分:0)
在@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;
};