模板专用化与静态函数模板

Template Specialization with Template for Static Function

本文关键字:静态 函数模板 专用      更新时间:2023-10-16

我有一个从另一个模板继承的模板,其自身作为第二个模板的模板参数。 继承的模板定义了一个静态函数:

template<class T> class A
{
public:
    static void foo();
};
template<class T> class B : public A<B>
{
};

现在我想为专门用于 B 的类 A 实现静态函数,但 B 不专用。 但是我不知道如何声明模板。 我什至不确定这是否可能。 我的第一次尝试是:

template<class T> void A<B<T>>::foo()
{
}

但这给出了错误:

"Nested name specifier 'A<B<T>>::" for declaration does not refer into a class, class template or class template partial specialization"

我尝试了不同的事情,例如在前面添加"模板<>",但没有一个奏效。 我能够编译这个:

template<> void A<B<int>>::foo()
{
}

以及这个:

template<class T> void A<T>::foo()
{
}

这是部分专业化的尝试吗? 我的第一印象是否定的(没有具有多个参数的模板,我想专门化其中一个(。 相反,我想用另一个不专门的模板专门化一个模板。 这是否可能,如果是,正确的语法是什么?

这确实是部分专业化。你不能部分专化一个方法,你必须部分专化整个类。看到这个答案。您可以尝试在单独的帮助程序结构中实现 foo,并改为部分专用于该结构。

下面是使用帮助程序结构的示例。

#include <iostream>
template<class T> struct t_helper
{
    static void foo()
    {
        std::cout << "Not B<T>n";
    }
};
template<class T> class A
{
public:
    static void foo() {
        t_helper<T>::foo();
    }
};
template<class T> class B {};
// Specialize the behavior of A<T>::foo() for all B types
template<class T> 
struct t_helper<B<T>>
{
    static void foo()
    {
        std::cout << "Is B<T>n";
    }
};
int main()
{
    A<int>::foo();    // Prints "Not B<T>n"
    A<B<int>>::foo(); // Prints "Is B<T>n"
    return 0;
}