📜  C++中的模板元编程

📅  最后修改于: 2021-05-25 21:25:44             🧑  作者: Mango

预测以下C++程序的输出。

#include 
using namespace std;
  
template struct funStruct
{
    enum { val = 2*funStruct::val };
};
  
template<> struct funStruct<0>
{
    enum { val = 1 };
};
  
int main()
{
    cout << funStruct<8>::val << endl;
    return 0;
}

输出:

256

程序计算“ 2提升到幂8(或2 ^ 8)”。实际上,结构funStruct可用于为任何已知的n(或常数n)计算2 ^ n。上面程序的特殊之处是:计算是在编译时完成的。因此,是编译器计算2 ^ 8。为了了解编译器是如何做到的,让我们考虑以下有关模板和枚举的事实:

1)我们可以将非类型参数(不是数据类型的参数)传递给类/函数模板。
2)与其他const表达式一样,枚举常量的值在编译时求值。
3)当编译器看到模板的新参数时,编译器将创建模板的新实例。

让我们仔细看看原始程序。当编译器看到funStruct <8> :: val时,它尝试创建参数为8的funStruct实例,结果是还必须创建funStruct <7>,因为必须在编译时评估枚举常数val 。对于funStruct <7> ,编译器需要funStruct <6> ,依此类推。最后,编译器使用funStruct <1> :: val并终止编译时间递归。因此,使用模板,我们可以编写在编译时进行计算的程序,这些程序称为模板元程序。模板元编程实际上是图灵完备的,这意味着可由计算机程序表达的任何计算都可以通过模板元程序以某种形式进行计算。模板元编程通常不用于实际程序中,尽管这是一个有趣的概念。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”