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 ++中的新发现吗?
答案 0 :(得分:3)
结构如何继承自己?
没有。结构不能继承自己。
作为结构模板实例的结构可以继承同一模板的另一个实例,只要父实例使用不同的模板参数†进行实例化。
at_impl
不是结构;它是一个模板。at_impl<It, when<true>>
是模板的一个实例,它是一个结构。
请注意,在实例化派生结构时,父结构必须是完整的。如果父项是专业化,则可以这样做。您的示例既未显示at_impl<It, when<true>>
专门化的定义,也未显示at_impl
的任何实例化。
这类似于功能。函数可以递归调用自身,但函数参数必须更改。如果函数使用相同的参数调用自身,则递归永远不会终止。没有参数的函数不能递归††。
现在,模板有参数,类似于带参数的函数。类型没有模板参数,类似于没有参数的函数。实例化模板会产生类型,类似于函数调用。
†这是终止递归的必要条件,但还不够。
††除非函数依赖于全局状态,否则从抽象的角度来看,我们必须将全局状态视为此上下文中的隐式参数。
答案 1 :(得分:1)
at_impl
是struct
/ class
模板,从中生成struct
/ class
。
at_impl
的不同模板参数会生成不同的struct
。
class
。