是否可以为模板类的成员函数编写专门化?

Is it possible to write specialization for member function of a template class?

本文关键字:函数 成员 专门化 是否      更新时间:2023-10-16
template <class T, bool flag>
class A
{
    //...
    void f()
    {
        std::cout << "false" << std::endl;
    }
    //...
};
template<class T>
void A<T, true>::f<T, true>()
{
    std::cout << "true" << std::endl;
}

上面的代码是错误的,不能编译,但是你知道我要做什么。我该怎么做呢?

你不能专门化一个类的一个方法。通常你可以在同一个T上使用模板嵌套类来解决这个问题。

template <class T, bool flag>
class A
{
    //...
    template <class Q, bool flag>
    class F_Helper
    {
        void operator()()
        {
            std::cout << "false" << std::endl;
        }
    };
    template <class Q>
    class F_Helper<Q, true>
    {
        void operator()()
        {
            std::cout << "true" << std::endl;
        }
    };
    F_Helper<T> f;
    //...
};

显然,如果您确实需要访问封闭类的this指针,则需要更多的样板文件

与其他答案相反,可以特化类模板的成员函数。但是你需要提供所有的模板参数

template<>
void A<int, true>::f()
{
    std::cout << "true" << std::endl;
}

你所尝试的是无效的:

template<typename T>
void A<T, true>::f()
{
    std::cout << "true" << std::endl;
}

为类模板的特定参数部分特化类模板的成员是无效的,因此这意味着"为<T, true>定义a的部分特化的成员函数'f'"。因为没有这样的部分专门化,编译器会报错。

如果不能提供所有参数,可以重载f,如下所示

template <class T, bool flag>
class A
{
    template<typename, bool> struct params { };
    void f()
    {
        f(params<T, flags>());
    }
    template<typename U>
    void f(params<U, true>) {
        std::cout << "true" << std::endl;
    }
    template<typename U, bool flag1>
    void f(params<U, flag1>) {
        std::cout << "dunno" << std::endl;
    }
};

可以专门化整个模板类- Ideone link

#include <iostream>
template <class T, bool flag>
class A
{
    //...
    void f()
    {
        std::cout << "false" << std::endl;
    }
    //...
};
template<class T>
class A<T, true>
{
    //...
    void f()
    {
        std::cout << "true" << std::endl;
    }
    //...
};

您需要对整个类进行专门化:

#include <iostream>
template <class T, bool flag>
class A
{
public:
    void f()
    {
        std::cout << "false" << std::endl;
    }
};
template<class T>
class A<T,true>
{
public:
    void f()
    {
        std::cout << "true" << std::endl;
    }
};
void main()
{
    A<int, false> a;
    a.f();
    A<int, true> b;
    b.f();
}