C ++模板元编程 - 不确定我是不是很大惊小怪?

时间:2013-02-23 20:12:18

标签: c++ templates template-meta-programming

据我所知,正常的C ++代码在编译时被翻译成汇编程序,然后由CPU在运行时执行。所以我不太清楚模板元编程的优点是什么?

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

  

模板元编程是一种元编程技术   编译器使用模板生成临时源代码,   这是由编译器与其余的源代码合并而成的   然后编译。这些模板的输出包括编译时   常量,数据结构和完整的功能。指某东西的用途   模板可以被认为是编译时执行。

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

我在问,因为我对模板元编程可以用来优化/提高低延迟C ++应用程序的效率感兴趣。我可能在途中没有正确理解,所以请随时纠正我的理解。

2 个答案:

答案 0 :(得分:3)

您是否阅读过那些彻底讨论TM的文章?例如:

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

让我们说你的程序需要计算一个数字的阶乘。使用TM,您可以在编译时计算阶乘,这会增加编译时间(和二进制大小),但会减少运行时间。示例代码来自上面的第二个站点;如果你以“天真”的方式做到这一点,你就会看到如下代码:

int factorial( int n) {
    return (n==0) ? 1 : n*factorial(n-1)l
}

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

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

// 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本质上是一个编译时常量。和往常一样,简单的例子并不是特别有用,但希望你能得到它的要点。

答案 1 :(得分:0)

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

正常的递归方式:

uint64_t fibonacci(int n) {
    if (n <= 2)
        return 1;
    else
        return fibonacci(n - 1) + fibonacci(n - 2);
}

使用元编程:

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。递归函数可能无法正常工作和崩溃,使用元编程的函数将完全正常且非常快。