【问题标题】:How can a struct inherits itself?结构如何继承自身?
【发布时间】:2017-08-24 05:32:09
【问题描述】:
template <bool condition>
struct when;

template <typename It, typename = void>
struct at_impl : at_impl<It, when<true>> { };

struct at_t {
    template <typename Xs, typename N>
    constexpr decltype(auto) operator()(Xs&& xs, N const& n) const;
};

constexpr at_t at{};

int main()
{
}

这个程序怎么编译?结构如何继承自己?! 我不知道这里发生了什么。这是 c++ 中的新功能吗?

【问题讨论】:

  • 你把自己弄糊涂了,没能区分 templatestypes
  • @KerrekSB:是的,我对模板不太熟悉。你能解释一下吗?为什么at_impl不需要定义就可以派生出来?
  • at_impl 模板永远不会在您的程序中实例化。所以永远不会有从自身派生的类型。
  • @JohnSmith:继承是 types 做的事情,而不是模板。您的代码中没有任何内容“继承自身”。当模板被实例化时,它会导致一种类型恰好继承自另一种类型。

标签: c++ c++11 templates inheritance c++14


【解决方案1】:

at_impl 是一个struct/class 模板,从中生成一个struct/class

at_impl 的不同模板参数生成不同的structs。允许从不同的struct/class 继承。

【讨论】:

  • 谢谢。我现在明白了。
【解决方案2】:

结构体如何继承自身?

没有。结构不能继承自身。

作为结构模板实例的结构可以继承同一模板的另一个实例,只要父级使用不同的模板参数进行实例化†。

at_impl 不是结构体;它是一个模板。at_impl&lt;It, when&lt;true&gt;&gt; 是模板的一个实例,它是一个结构体。

请注意,在实例化派生结构时,父结构必须是完整的。如果父母是专业化的,这是可能的。您的示例既没有显示at_impl&lt;It, when&lt;true&gt;&gt; 专业化的定义,也没有显示at_impl 的任何实例化。


这类似于函数。函数可以递归调用自身,但函数参数必须更改。如果一个函数用相同的参数调用自己,那么递归永远不会终止。没有参数的函数不能递归††。

现在,模板有参数,类似于带参数的函数。类型没有模板参数,类似于没有参数的函数。实例化模板会产生一个类型,类似于函数调用。


† 这是递归终止的必要条件,但不是充分条件。

†† 除非函数依赖于全局状态,但从抽象的角度来看,我们必须将全局状态视为此上下文中的隐含参数。

【讨论】:

    猜你喜欢
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多