模板编程之技巧(一)

最近在coolshell上看到这样的一个程序,通过使用模板来求质数序列,感觉挺有意思,于是自己将代码导到自己机子上跑了下,感觉还是不错的,根据这个思想自己回忆起了在找工作时,曾遇到的一个面试题(不能使用乘除法以及循环,求解一个1+2+3+4+5....+N的和),这道题通过使用这个思想同样可以求解,下面我们先来看看coolshell上的这个代码吧,代码如下:

#include <stdio.h>
using namespace std;

template<int N,int D = N-1>
struct isPrime
{
    enum{
        result = (N%D)&&isPrime<N,D-1>::result
    };
};

template<int N>
struct isPrime<N,1>
{
    enum{
        result = true
    };
};

template<int N,bool isprime>
struct printIfPrime
{
    static inline void print(){}
};

template<int N>
struct printIfPrime<N,true>
{
    static inline void print()
    {
        printf("%d ",N);
    }
};

template<int N,int MAX>
struct printPrimes
{
    static inline void print()
    {
        printIfPrime<N,isPrime<N>::result>::print();
        printPrimes<N+1,MAX>::print();
    }
};
template<int N>
struct printPrimes<N,N>
{
    static inline void print()
    {
        printIfPrime<N,isPrime<N>::result>::print();
    }
};

int main()
{
    printPrimes<2,100>::print();
    printf("\n");
    return 0;
}


测试结果:

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

2. 面试题代码如下:

#include <stdio.h>
using namespace std;

template<int N>
struct add
{
    enum{
        sum = add<N-1>::sum + N
    };
};

template<>
struct add<0>
{
    enum{
        sum = 0
    };
};

template<int N>
struct printSum
{
    static inline void print()
    {
        printf("sum:%d\n",add<N>::sum);
    }
};

int main()
{
    printSum<100>::print();
    return 0;
}


测试结果:

sum:5050

 

3. 逆序打印1-n数,不使用任何的循环语句,代码如下:

#include <stdio.h>
using namespace std;

template<int N>
struct prints
{
    enum
    {
        result = N
    };
};
template<>
struct prints<0>
{
    enum
    {
        result = 0
    };
};

template<int N>
struct printNum
{
    static inline void print()
    {
        printf("%d ",prints<N>::result);
    }
};

template<>
struct printNum<0>
{
    static inline void print()
    {
        printf("%d ",0);
    }
};
template<int N>
struct printNumber
{
    static inline void print()
    {
        printNum<N>::print();
        printNumber<N-1>::print();
    }
};
template<>
struct printNumber<0>
{
    static inline void print()
    {
        printNum<0>::print();
    }
};


int main()
{
    printNumber<20>::print();
    printf("\n");
    return 0;
}


测试结果:

20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

 

4. 顺序打印1-n 个数,不能使用任何的循环语句

#include <stdio.h>
using namespace std;

template<int N,int D>
struct prints
{
    enum
    {
        result = N
    };
};
template<int N>
struct prints<N,0>
{
    enum
    {
        result = 0
    };
};

template<int N,int D>
struct printNum
{
    static inline void print()
    {
        printf("%d ",prints<N,D>::result);
    }
};

template<int N>
struct printNum<N,0>
{
    static inline void print()
    {
    }
};
template<int N,int MAX>
struct printNumber
{
    static inline void print()
    {
        printNum<N,MAX>::print();
        printNumber<N+1,MAX-1>::print();
    }
};
template<int N>
struct printNumber<N,0>
{
    static inline void print()
    {
        printNum<N,0>::print();
    }
};


int main()
{
    printNumber<1,20>::print();
    printf("\n");
    return 0;
}


测试结果:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

总结

       这篇博文主要是看coollshell上面的文章有感而发,感觉这种思想还是蛮有意思,其实很多的简单的算法都可以试着使用模板的方式来实现,这种方式最大的优点就是可以缩小程序的运行时间,但是弊端也是很明显的,其会增加程序的编译时间,至于如何取舍,关键是要看需求了,好了,本篇博文到此结束,多谢。

如果需要,请注明转载,多谢

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值