• C++ 编译期计算


    C++ 编译期计算

    模板元编程是个强大的工具,据说足以作为一门完备的语言了。这里只是简单记录一下,利用模板实现编译期计算的方式。

    sum([1,...n])

    #include <stdio.h>
    
    // 递推公式
    template<int n>
    class Sum {
    public:
        static const int value = n + Sum<n-1>::value;
    };
    
    // 边界值特化
    template <>
    class Sum<0> { // 注意 0 的位置
    public:
        static const int value = 0; // 注意全都是静态常量,才能保存到binary中const区
    };
    
    int main() {
        printf("%d
    ", Sum<100>::value);
    }
    

    斐波那契数列

    template <int num>
    class Fibonacci {
    public:
        static const int value = Fibonacci<num - 1>::value + Fibonacci<num - 2>::value;
    };
    
    template <>
    class Fibonacci<0> {
    public:
        static const int value = 0;
    };
    
    template <>
    class Fibonacci<1> {
    public:
        static const int value = 1;
    };
    

    组合数

    template <int n, int m>
    class Combinatorial {
    public:
        static const int value = Combinatorial<n - 1, m>::value + Combinatorial<n - 1, m - 1>::value;
    };
    
    template <int m>
    class Combinatorial<0, m> {
    public:
        static const int value = 0;
    };
    
    template <int n>
    class Combinatorial<n, 0> {
    public:
        static const int value = 1;
    };
    
    template <>
    class Combinatorial<0, 0> { // 可以同时匹配 <0,m> 和 <n,0> 的 <0,0> 需要特别给出
    public:
        static const int value = 1;
    };
    
  • 相关阅读:
    终于回来了&&邮递员送信
    发射站
    黑匣子
    利维坦——(1)
    预告
    整除(水题)
    BZOJ054_移动玩具_KEY
    BZOJ4034_树上操作_KEY
    树链剖分学习&BZOJ1036
    BZOJ1208_宠物收养所_KEY
  • 原文地址:https://www.cnblogs.com/zhcpku/p/15202871.html
Copyright © 2020-2023  润新知