gpt4 book ai didi

c++ - 作为模板类成员的模板类的特化

转载 作者:可可西里 更新时间:2023-11-01 17:55:30 24 4
gpt4 key购买 nike

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

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

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

最佳答案

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

In an explicit specialization declaration for a member of a class template or a member template that appears in namespace scope, the member template and some of its enclosing class templates may remain unspecialized, except that the declaration shall not explicitly specialize a class member template if its enclosing class templates are not explicitly specialized as well.

(强调我的)

在某些情况下,您可以通过使嵌套名称 s 成为可以部分专门化的 namespace 范围助手的别名来解决这个问题。像这样:

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)。

关于c++ - 作为模板类成员的模板类的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55296960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com