c++ - C++模板元编程的归纳法是什么?

标签 c++ templates template-meta-programming

当涉及到模板元程序时,人们总是说使用归纳法解决问题。例如看到这个答案:https://stackoverflow.com/a/11811486/4882052

我知道归纳证明等,但这个理论如何用于解决元程序?。我喜欢有例子的例子:)

最佳答案

“归纳法”只是从不同的角度看递归。在每一种情况下,您都需要一个或多个基本案例,在这些案例中,可以在不递归的情况下解决问题,并且您需要一个递归案例,在递归案例中,可以通过使用更接近基本案例的相关问题的解决方案来解决问题。

在运行时递归编程中,可以通过运行时条件检测基本情况。在递归元编程中,即使是编译时条件也不足以处理基本情况。您需要利用重载或专门化来涵盖基本情况的单独定义。

我自己第一次用的时候比较乱,不能全文引用,但大概的思路可能有指导意义。编译器在展开短循环之前进行了各种优化,并在展开短循环之后进行了各种其他优化。但我真的需要在之后完成那些“之前”的优化之一。因此,我需要强制编译器在编译早期解除一些短循环,大致如下:

template<unsigned N>
struct unwind {
   void operator()(X*p) { unwind<N-1>()(p); work(p[N]); } };
template<>
struct unwind<0> {
   void operator()(X*p) { work(p[0]); } };

当您使用编译时递归而不是运行时循环时,编译器将在进行任何优化之前展开整个循环,因此在我的工作<中,在循环展开之前完成的类型优化 在循环展开完成之前,代码是不可见的。

关于c++ - C++模板元编程的归纳法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34359568/

相关文章:

c++ - 检查容器模板类中的迭代器类型

c++ - 通过模板检查 c++11 中是否存在函数(不是方法)

c++ - 如何在其余代码运行时每分钟执行一个函数

templates - 什么是无逻辑模板

c++ - 在模板类中声明的 friend 模板函数导致 undefined symbol 链接错误

c++ - 双向链表模板中的几件事

c++ - 作为模板参数的结构数组

c++ - 检查类型是否可以作为 boost::lexical_cast<string> 的参数

c++ - 使用chrono C++与时间进行比较

c++ - GCC/进行构建时间优化