c++模板部分专业化

c++ template partial specialization

本文关键字:专业化 板部 c++      更新时间:2023-10-16

这可能是以前有人问过的问题,但我找不到…

我在.hpp文件中有一个类:

class A{
    public:
        A(){//constructor}
        ~A(){//destructor}
        //some public methods and arguments
        template<typename Type>
            void func(Type t){//do something for numbers}
    private:
        //some private methods and arguments
}

template方法应该适用于int、double。。。但不适用于字符串。因此,在我的.hpp文件中,我定义了func对数字的作用,并在.cpp文件中写道:

template<>
void A::func(std::string t){ // do something in that case}

但当我将函数funcstd::string一起使用时,程序会调用数字的方法。。。因此,我将.hpp文件替换为:

class A{
    public:
        A(){//constructor}
        ~A(){//destructor}
        //some public methods and arguments
        template<typename Type>
            void func(Type t){//do something for numbers}
        void func(std::string s);
    private:
        //some private methods and arguments
}

我的.cpp文件变成了:

void A::func(std::string t){ // do something in that case}

然后一切正常!

我的问题是,这样做正确吗?

这不是部分专门化(没有未专门化的模板参数),而是显式专门化。

模板必须对使用它们的代码可见,如果你没有在头文件中声明专门化,那么试图用string调用A::func的代码将实例化主模板(表示数字的模板)并使用它,因为他们甚至不知道字符串专门化的存在。

因此,您必须(至少)在标头中声明专门化,以便它在.cpp文件之外可用:

template<>
void A::func(std::string t);

然而,使用重载的替代方案更简单,完全可以接受。它之所以有效,是因为string的重载是在标头中声明的,所以调用它的代码知道要调用哪个函数。

重载对于许多目的来说都是一种很好的方法。然而,我怀疑,如果您也为const char *添加一个专门化,那么您原来的模板方法也可以工作。这样,您就可以在不解析为数字版本的情况下传入字符串文字。