最近无聊,写了一个基于C++模板的求前n个质数的程序。
编译速度极其之慢。。
不过运行速度相当可以。
恩。如果C++的模板再多一点关键字的话,就可以看做是Lisp语言了。。
不过话说回来,引用一下老刘的话:
marchliu 写道
C++模板语法只差一步,只要加入类似Lisp关键字的一些东西,就可以让模板方便的控制编译过程了。
但是,在这之前,C++就已经太笨重了。
C++已经到了悬崖边上了,现在委员会决定再向前迈一步……
但是,在这之前,C++就已经太笨重了。
C++已经到了悬崖边上了,现在委员会决定再向前迈一步……
下面贴上代码做备忘:
#include <iostream>
template <int p, int i>
struct is_prime{
enum {
result = (p == 2) || (p % i) && is_prime<(i>2?p:0), i-1>::result
};
};
template <>
struct is_prime<0, 0>{
enum {
result = 1
};
};
template <>
struct is_prime<0, 1>{
enum {
result = 1
};
};
template <>
struct is_prime<1, 0>{
enum {
result = 0
};
};
template <int, int> struct If;
template <int> struct next_prime;
template <int i>
struct If<1, i>{
enum {
result = i
};
};
template <int i>
struct If<0, i>{
enum {
result = next_prime<i>::result
};
};
template <int i>
struct next_prime{
enum {
result = If<is_prime<i + 1, i>::result, i + 1>::result
};
};
template <int i, int j>
struct loop{
enum {
result = loop<i - 1, next_prime<j>::result>::result + next_prime<j>::result
};
};
template <>
struct loop<0, 2>{
enum {
result = 2
};
};
template <int sum, int prime, int i>
struct num_of{
enum {
result = num_of<sum + next_prime<prime>::result, next_prime<prime>::result, i - 1>::result
};
};
template <int sum, int prime>
struct num_of<sum, prime, 0>{
enum {
result = sum
};
};
int main(){
//std::cout << loop<10000>::result << std::endl;
//std::cout << next_prime<3>::result << std::endl;
std::cout << num_of<0, 0, 5>::result << std::endl;
return 0;
}
还是很晦涩啊。。