代码之家  ›  专栏  ›  技术社区  ›  Jonathan Mee

变量模板的部分专门化

  •  5
  • Jonathan Mee  · 技术社区  · 7 年前

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

    variable templates ? 我找不到关于它们是否可以部分专业化的文档。

    1 回复  |  直到 7 年前
        1
  •  6
  •   Nikita Kniazev    7 年前

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

    与主类模板或主 变量模板 在实例化基于模板参数的专门化时,将考虑。。。

    以及 [temp.expl.spec]/7

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

    它也在报告中提到 [constraints.namespace.std]/3 :

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


    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

    推荐文章