结构如何继承自己?

时间:2017-03-30 10:35:53

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

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 ++中的新发现吗?

2 个答案:

答案 0 :(得分:3)

  

结构如何继承自己?

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

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

at_impl不是结构;它是一个模板。at_impl<It, when<true>>是模板的一个实例,它是一个结构。

请注意,在实例化派生结构时,父结构必须是完整的。如果父项是专业化,则可以这样做。您的示例既未显示at_impl<It, when<true>>专门化的定义,也未显示at_impl的任何实例化。

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

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

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

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

答案 1 :(得分:1)

at_implstruct / class模板,从中生成struct / class

at_impl的不同模板参数会生成不同的struct。 struct / class