写点什么

C++ 模板元编程的两个例子

作者:老王同学
  • 2023-03-13
    广东
  • 本文字数:688 字

    阅读完需:约 2 分钟

C++模板元编程,是使用 template 进行编译期运算的一种机制,可以认为是 C++的一种编程方式。

第一个例子:计算整数 N 的阶乘。
//模板的一般形式template<int N>class Factorial{public:    enum    {        _result = N * Factorial<N-1>::_result    };}; //用于结束递归规则的特化模板template<>class Factorial<0>{public:    enum    {        _result = 1    };}; int main(){    const int Num = 10;    cout << Num << "! = " << Factorial<Num>::_result << endl;}
复制代码

运行结果:10! = 3628800

其中的思考方式,我感觉是数学归纳法的应用。注意模板在其中起的作用,在编译期,编译器使用 template 生成了 class Factorial<0>……class Factorial<10>一共 11 个 class 定义,在程序运行时其实计算过程并没有占用 CPU 时间,只不过这么多 class 的定义占用了一些内存。


第二个例子:编译期的 if 语句

这是 Bjarne Stroustrup 在《Evolving a language in and for the real world C++ 1991-2006》一文中举的例子。


struct T_Left{    int value;};struct T_Right{    char value;}; template<bool b, class X, class Y>struct if_{    typedef X type; // use X if b is true};template<class X, class Y>struct if_<false, X, Y>{    typedef Y type; // use Y if b is false};  int main(){    cout << "Type Size = " << sizeof(if_<sizeof(T_Left) < 4, T_Left, T_Right>::type) << endl;}
复制代码

其实也是根据编译期能确定的值,来进行编译期的选择。


模板元编程的应用包括:Blitz++库;boost::mpl 库;以及《Modern C++ Design》一书中提到的 typelist。

发布于: 刚刚阅读数: 3
用户头像

老王同学

关注

还未添加个人签名 2020-04-30 加入

还未添加个人简介

评论

发布
暂无评论
C++模板元编程的两个例子_c++_老王同学_InfoQ写作社区