MEM*_*EMS 5 c++ metaprogramming template-specialization
考虑以下代码:
struct X
{
template <typename T>
class Y
{};
};
template<>
class X::Y<double>{
};
Run Code Online (Sandbox Code Playgroud)
在这里,我们将 Y 类专门用于 double 类型,并且代码运行良好。问题是,如果我将代码更改为:
template<typename A>
struct X
{
template <typename T>
class Y
{};
};
template<typename A>
class X<A>::Y<double>{
};
Run Code Online (Sandbox Code Playgroud)
编译器会报错:
'X::Y':显式专业化正在使用部分专业化语法,请使用模板 <> 代替!
有人知道在这种情况下我该如何专业化 Y 类吗?
简单的答案 - 你不能完全专门化模板化外部类的模板化内部类。但如果你真的想达到类似的效果,你可以尝试使用虚拟默认模板参数进行部分特化:
#include <iostream>
template<typename A>
struct X
{
template <typename T, T* =nullptr>
class Y{};
};
template<typename A>
template<double *Ptr>
class X<A>::Y<double, Ptr> {
public:
static constexpr int value = 1;
};
int main() {
std::cout << X<int>::Y<double>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)