内部 class 的模板专业化
Template specializations for inner class
考虑以下代码:
struct X
{
template <typename T>
class Y
{};
};
template<>
class X::Y<double>{
};
这里我们将 Y class 专门用于 double 类型,代码运行良好。问题是,如果我将代码更改为:
template<typename A>
struct X
{
template <typename T>
class Y
{};
};
template<typename A>
class X<A>::Y<double>{
};
编译器会报错:
'X::Y': explicit specialization is using partial
specialization syntax, use template <> instead!
谁知道在这种情况下我如何专门化 class Y?
如果不显式特化外部模板,则无法特化内部模板 class。 See this question for more details and a quote from the standard.
解决方法: 创建一个外部 class,在 detail 命名空间中同时使用 T
和 A
,并在 X
:
namespace impl
{
template <typename A, typename T>
struct Y { };
}
template<typename A>
struct X
{
template <typename T>
using Y = impl::Y<A, T>;
};
如果您可以明确特化内部和外部 class,您可以使用以下语法:
template <>
template <>
class X<int>::Y<double>
{
// ...
};
简单的答案 - 您不能完全特化模板化外部 class 的模板化内部 class。但是如果你真的想达到类似的效果,你可以尝试使用虚拟默认模板参数进行部分专业化:
#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;
}
考虑以下代码:
struct X
{
template <typename T>
class Y
{};
};
template<>
class X::Y<double>{
};
这里我们将 Y class 专门用于 double 类型,代码运行良好。问题是,如果我将代码更改为:
template<typename A>
struct X
{
template <typename T>
class Y
{};
};
template<typename A>
class X<A>::Y<double>{
};
编译器会报错:
'X::Y': explicit specialization is using partial specialization syntax, use template <> instead!
谁知道在这种情况下我如何专门化 class Y?
如果不显式特化外部模板,则无法特化内部模板 class。 See this question for more details and a quote from the standard.
解决方法: 创建一个外部 class,在 detail 命名空间中同时使用 T
和 A
,并在 X
:
namespace impl
{
template <typename A, typename T>
struct Y { };
}
template<typename A>
struct X
{
template <typename T>
using Y = impl::Y<A, T>;
};
如果您可以明确特化内部和外部 class,您可以使用以下语法:
template <>
template <>
class X<int>::Y<double>
{
// ...
};
简单的答案 - 您不能完全特化模板化外部 class 的模板化内部 class。但是如果你真的想达到类似的效果,你可以尝试使用虚拟默认模板参数进行部分专业化:
#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;
}