首页 > 解决方案 > 变量模板的部分专业化

问题描述

我知道我可以部分专门化类模板,并且我知道我不能部分指定函数模板。

变量模板呢?我找不到关于它们是否可以部分专业化的文档。

标签: c++templateslanguage-lawyerpartial-specializationvariable-templates

解决方案


是的,根据[temp.arg.template]/2

当实例化基于模板模板参数的特化时,会考虑与主类模板或主变量模板关联的任何部分特化。...

并到[temp.expl.spec]/7

...类模板的部分特化声明、变量模板、非模板类的成员类模板、非模板类的静态数据成员模板、类模板的成员类模板等的放置...

它还在[constraints.namespace.std]/3中提到:

如果 C++ 程序声明任何标准库变量模板的显式或部分特化,则其行为是未定义的,除非该变量模板的规范明确允许。


更不用说所有主要的编译器(Clang、GCC 和 MSVC)都没有问题:

template <int x, int y>
constexpr int foo = -1;

template <>
constexpr float foo<1, 0> = 1.0;

template <int x>
constexpr double foo<1, x> = 1.1;

int main()
{
    static_assert(foo<0, 0> == -1, "");
    static_assert(foo<0, 1> == -1, "");
    static_assert(foo<1, 0> == 1.0, "");
    static_assert(foo<1, 1> == 1.1, "");
}

https://godbolt.org/z/R1c1zo


推荐阅读