标题:可变参数模板的递归继承的困惑
只看楼主
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
题外话:C/C++语言中没有定义“递归”的概念,自然编译器也没有。(即使是常见的“递归函数”也只是人类眼中是“递归”,在编译器眼中它根本不区分是否调用的是同一个函数)

编译器看到 tuple<A,B,C> 就去找 tuple 的定义,找到 class tuple<Head,Tail...> : private tuple<Tail...>,匹配成 class tuple<A,B,C> : private tuple<B,C>
编译器看到 tuple<B,C> 就去找 tuple 的定义,找到 class tuple<Head,Tail...> : private tuple<Tail...>,匹配成 class tuple<B,C> : private tuple<C>
编译器看到 tuple<C> 就去找 tuple 的定义,找到 class tuple<Head,Tail...> : private tuple<Tail...>,匹配成 class tuple<C> : private tuple<>
编译器看到 tuple<> 就去找 tuple 的定义,找到 class tuple<>,匹配成 class tuple<>
没了,就这样结束了。

你看到编译器在不停地匹配同一个类模板,认为在递归;而编译器却不清楚这一点(主要的是不想知道,知道了也没用),它做的事很简答:遇到一个不认识的东西就去找它的适配。

2022-11-07 13:18
lllyyy3
Rank: 2
等 级:论坛游民
威 望:1
帖 子:24
专家分:20
注 册:2022-10-15
得分:0 
以下是引用rjsp在2022-11-7 13:18:54的发言:

题外话:C/C++语言中没有定义“递归”的概念,自然编译器也没有。(即使是常见的“递归函数”也只是人类眼中是“递归”,在编译器眼中它根本不区分是否调用的是同一个函数)

编译器看到 tuple<A,B,C> 就去找 tuple 的定义,找到 class tuple<Head,Tail...> : private tuple<Tail...>,匹配成 class tuple<A,B,C> : private tuple<B,C>
编译器看到 tuple<B,C> 就去找 tuple 的定义,找到 class tuple<Head,Tail...> : private tuple<Tail...>,匹配成 class tuple<B,C> : private tuple<C>
编译器看到 tuple<C> 就去找 tuple 的定义,找到 class tuple<Head,Tail...> : private tuple<Tail...>,匹配成 class tuple<C> : private tuple<>
编译器看到 tuple<> 就去找 tuple 的定义,找到 class tuple<>,匹配成 class tuple<>
没了,就这样结束了。

你看到编译器在不停地匹配同一个类模板,认为在递归;而编译器却不清楚这一点(主要的是不想知道,知道了也没用),它做的事很简答:遇到一个不认识的东西就去找它的适配。

懂了,原来是编译器自己会按照 tuple 的定义去匹配出来继承关系,之前一直不知道这个所以没有绕过弯来。
谢谢r老师!
2022-11-07 15:41



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-510571-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.087013 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved