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

时间:2011-07-29 13:56:09

标签: c++ templates

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

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

4 个答案:

答案 0 :(得分:5)

你不能只专门化一个类的方法。通常,您可以使用同一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指针,那么显然需要更多样板。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

您可以专门化整个模板类 - 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;
    }
    //...
};

答案 3 :(得分:0)

你需要专注于整个班级:

#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();
}