首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++模板元编程--不确定我是否很在意?

C++模板元编程--不确定我是否很在意?
EN

Stack Overflow用户
提问于 2013-02-23 20:12:17
回答 2查看 1.4K关注 0票数 0

据我所知,普通的C++代码在编译时被转换成汇编程序,然后由CPU在运行时执行。因此,我不太明白模板元编程的优点是什么?

维基百科介绍了关于模板元编程的如下内容:

模板元编程是一种元编程技术,编译器使用模板生成临时源代码,编译器将其与其他源代码合并,然后编译。这些模板的输出包括编译时常量、数据结构和完整函数。模板的使用可以看作是编译时的执行。

这似乎并没有真正强调模板元编程对我的好处.?

我之所以问这个问题,是因为我对模板元编程可以做什么来优化/提高低延迟C++应用程序的效率感兴趣。在此过程中,我可能还没有正确理解一些东西,所以请随时纠正我的理解。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-23 20:25:19

你读过无数篇关于TM的文章吗?例如:

  • http://www.codeproject.com/Articles/3743/A-gentle-introduction-to-Template-Metaprogramming
  • cpp/ch06s04.html
  • http://blog.lorentey.hu/2010/04/21/cpp-template-metaprogramming/
  • 等等

一种简单的看待(一种)模板元编程的方法是“强”回忆录。以下是一个常见的例子:

假设您的程序需要计算某个数字的阶乘。使用TM,您可以在编译时计算阶乘,这会增加编译时间(和二进制大小),但会减少运行时。示例代码来自上面的第二个站点;如果您是以“天真”的方式这样做的,那么您的代码如下所示:

代码语言:javascript
运行
复制
int factorial( int n) {
    return (n==0) ? 1 : n*factorial(n-1)l
}

int main() {
    cout << factorial(5) << endl;
    return 0;
}

使用TM,我们可以在编译时计算阶乘:

代码语言:javascript
运行
复制
// factorial.cpp

#include <iostream>

template <int N>
struct Factorial {
    enum { value = N * Factorial<N-1>::value };
};

template <>
struct Factorial<1> {
    enum { value = 1 };
};

// example use
int main() {
    const int fact5 = Factorial<15>::value;
    std::cout << fact5 << endl;
    return 0;
}

这里,Factorial<15>::value本质上是一个编译时常数。和往常一样,简单的示例并不特别有用,但希望您能够理解其中的要点。

票数 3
EN

Stack Overflow用户

发布于 2013-02-24 11:06:01

另一个例子是如何计算斐波纳契序列。

执行此操作的正常递归方法:

代码语言:javascript
运行
复制
uint64_t fibonacci(int n) {
    if (n <= 2)
        return 1;
    else
        return fibonacci(n - 1) + fibonacci(n - 2);
}

使用元编程:

代码语言:javascript
运行
复制
template< int n > struct Fibonacci {
    static const uint64_t value = Fibonacci< n-1 >::value +  Fibonacci< n-2 >::value;
};

template<> struct Fibonacci< 1 > {
    static const uint64_t value = 1;
};

template<> struct Fibonacci< 0 > {
    static const uint64_t value = 0;
};

现在,您可以自己尝试调用fibonacci(80)Fibonacci<80>::value。递归函数可能无法工作和崩溃,使用元编程的函数将非常精细和快速。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15045112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档