c – 编译时间递归和条件
发布时间:2020-12-16 05:31:19 所属栏目:百科 来源:网络整理
导读:我正在阅读对 “Printing 1 to 1000 without loop or conditionals”的回应,我想知道为什么有必要为NumberGeneration 1在最高的答案. 如果我删除它,并在模板(代码如下)中添加一个N == 1的检查,代码将无法编译“模板实例深度超过最大值”,但我不知道为什么.条
我正在阅读对
“Printing 1 to 1000 without loop or conditionals”的回应,我想知道为什么有必要为NumberGeneration< 1>在最高的答案.
如果我删除它,并在模板(代码如下)中添加一个N == 1的检查,代码将无法编译“模板实例深度超过最大值”,但我不知道为什么.条件句在编译时处理不同? #include <iostream> template<int N> struct NumberGeneration { static void out(std::ostream& os) { if (N == 1) { os << 1 << std::endl; } else { NumberGeneration<N-1>::out(os); os << N << std::endl; } } }; int main() { NumberGeneration<1000>::out(std::cout); } 解决方法
代码生成和编译根据条件不分支!考虑这个:
// don't declare bar()! void foo() { if (false) { bar(); } } 如果您从未声明bar(),即使内部范围无法访问,这也是一个编译错误.出于同样的原因,NumberGeneration< N-1>总是被实例化,无论是否可以达到该分支,并且您有无限递归. 实际上,条件的静态模拟是模板专门化: template <> struct NumberGeneration<0> { /* no more recursion here */ }; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ruby-on-rails – 我可以直接从routes.rb渲染布局,没有控制
- c – 我应该使用手动分配来允许移动语义吗?
- objective-c – 在copyWithZone中为可变子类返回[self reta
- Vue不能观察到数组length的变化
- c – 执行时间:GetFrontBufferData,GetBackBuffer,GetRend
- regular expression(正则表达式)
- objective-c – iOS:在ImageView上绘制一个矩形并调整边框
- 类中的typealias vs swift中的函数(iOS)
- c# – 模拟复杂的第三方库
- Flex解决“无法为区域设置“zh_CN”解析资源束“ViewerStri