属于模板类的成员模板类的特化

8

有没有可能拥有一个专门的模板类,它是一个非特化的模板类的成员变量?

对于一个非模板的父类,这个是可行的:

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; }
};

搜索结果显示函数似乎不可行(?), 但是对于类/结构体呢? 特化模板类的模板成员

1个回答

6
不,这是不可能的。只有当所有封闭类模板也被特化时,成员类模板才能被特化。引用C++2x (N4713) [temp.expl.spec] 17.8.3/17:
“在类模板的成员或命名空间范围内出现的成员模板的显式特化声明中,成员模板及其一些封闭类模板可以保持未特化状态,但是如果未特化的封闭类模板不明确特化类成员模板,则该声明不得明确专门化。”
(Emphasis mine)
在某些情况下,您可以通过将嵌套名称 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; }
};

为了减少对的曝光,它当然可以隐藏在一个适当命名的内部命名空间(如)中。

这让我感到难过,因为现在必须将私有类型暴露给命名空间。 - Aart Stuurman
1
@AartStuurman 当然可以将其隐藏在适当命名的名称空间(如detail)中。 - Angew is no longer proud of SO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接