属于模板类成员的模板类的专业

时间:2019-03-22 09:52:16

标签: c++ templates

是否可以有一个专门的模板类,它是模板类的成员(本身不是专门的)?

使用非模板父类可以工作:

class owner
{
    template<int num>
    struct s
    {
        int ret() { return num; }
    };
};

template<>
struct owner::s<0>
{
    int ret() { return 0; }
};

但是在将owner用作模板类时,它不会:

template<typename some>
class owner
{
    template<int num>
    struct s
    {
        int ret() { return num; }
    };
};

template<typename some>
struct owner<some>::s<0>
{
    int ret() { return 0; }
};

搜索显示这对于函数来说是不可能的(?),但是类/结构怎么样? Specializing a templated member of a template class

1 个答案:

答案 0 :(得分:5)

否,那是不可能的。成员类模板只有在其所有封闭类模板也都具有特殊性的情况下,才能具有特殊性。引用C ++ 2x(N4713)[temp.expl.spec] 17.8.3 / 17:

  

在明确的专业声明中用于类模板的成员或成员模板,   出现在名称空间范围中,成员模板及其某些封闭的类模板可能会保留   非专业的,除非声明不得明确地专门化类成员模板(如果其声明)   封闭的类模板也没有明确地专门化。

(强调我的)

在某些情况下,您可以通过将嵌套名称s用作名称空间范围的助手的别名来解决此问题,该助手可以部分地专门化。像这样:

template <class some, int num>
struct s_helper
{
  int ret() { return num; }
};

template<typename some>
class owner
{
    template<int num>
    using s = s_helper<some, num>;
};

template<typename some>
struct s_helper<some, 0>
{
    int ret() { return 0; }
};

要减少s_helper的曝光率,它当然可以隐藏在适当命名的内部名称空间(例如detail)中。