部分模板成员特化

partial template member specialization

给定以下定义:

template <typename T>
class A {

public:

   void f();

};

template <typename T>
void
A<T>::f()
{}

template <typename T>
class B {};

我将如何部分专攻 A<B<T>>::f,即 f 对于某些 B<T>?我基本上是在寻找 正确的魔法 来替代下面的 ???

template <???>
void
A<B<T>>::f()
{}

您不能部分特化一个成员函数(实际上也不是任何函数)。您需要部分专门化整个 class:

template<typename T>
class A<B<T>>
{
    // implement member functions for this specialization here
};

C++11 有 Alias Templates,允许你做类似的事情:

template<T>
using AB = A<B<T>>;

那你可以参考AB<T>而不是A<B<T>>

不幸的是,you can't use that for specialization.

所以在我看来,你的问题的答案是:你不能那样做,但很遗憾。

您可以从 [temp.expl.spec]:

获得 显式 专业化

An explicit specialization of any of the following:
— ...
— member function of a class template
— ...
can be declared by a declaration introduced by template<>

即:

template <>
void A<B<int>>::f() {
    std::cout << "B\n";
}

但是您不能对 class 模板的成员函数进行部分特化。您将不得不部分专门化整个 class:

template <typename T>
class A<B<T>> {
public:
    void f() {
        std::cout << "B\n";
    }

    // ... all other members you want in A<B<T>> ...
};

如果你必须:

template <typename T>
void A<B<typename T>>::f() {}

那么你唯一的选择就是部分专业化 A

template <typename T> class A<B<T>>
{
   public:
      void f();
};