部分模板成员特化
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();
};
给定以下定义:
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 bytemplate<>
即:
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();
};