免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1501 | 回复: 6
打印 上一主题 下一主题

你的编译器死了吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-06-13 15:41 |只看该作者 |倒序浏览
#include <iostream>;
// primary template to compute sqrt(N)
template <int N, int LO=1, int HI=N>;
class Sqrt {
  public:
    // compute the midpoint, rounded up
    enum { mid = (LO+HI+1)/2 };

    // search a not too large value in a halved interval
    enum { result = (N<mid*mid) ? Sqrt<N,LO,mid-1>;::result
                                : Sqrt<N,mid,HI>;::result };
};

// partial specialization for the case when LO equals HI
template<int N, int M>;
class Sqrt<N,M,M>; {
  public:
    enum { result = M };
};

int main()
{
    std::cout << "Sqrt<23456>;::result = " << Sqrt<23456>;::result
              << '\n';
    std::cout << "Sqrt<25>;::result = " << Sqrt<25>;::result
              << '\n';
    std::cout << "Sqrt<42>;::result = " << Sqrt<42>;::result
              << '\n';
    std::cout << "Sqrt<1>;::result =  " << Sqrt<1>;::result
              << '\n';
}

如果你没有发现编译器死了, 那么祝贺你! 你的机器很强劲! 以上代码摘自《 C++ Templates - The Complete Guide》

论坛徽章:
0
2 [报告]
发表于 2003-06-13 23:03 |只看该作者

你的编译器死了吗?

我的死了。
FreeBSD4.7, 内存128M。

论坛徽章:
0
3 [报告]
发表于 2003-06-13 23:05 |只看该作者

你的编译器死了吗?

enum { result = (N<mid*mid) ? Sqrt<N,LO,mid-1>;::result
: Sqrt<N,mid,HI>;::result };
应该是这里需要的运算过多

论坛徽章:
0
4 [报告]
发表于 2003-06-16 11:23 |只看该作者

你的编译器死了吗?

这是对于模板技术的极致应用!

论坛徽章:
0
5 [报告]
发表于 2003-06-16 11:37 |只看该作者

你的编译器死了吗?

过犹不及
设计程序时不一定要执意使用某个技术
而是看看它能不能更好的实现你的目标

论坛徽章:
0
6 [报告]
发表于 2003-06-17 10:59 |只看该作者

你的编译器死了吗?

是啊我在调试这本书上面的示例的时候,也发现了这个问题。对于编译效率和执行效率的权衡也是一个问题。

抛开这个示例的在便是实践上的巨大的浪费,我还是觉得至少它演示了泛型技术的巨大生命力。值得我们去学习。

论坛徽章:
0
7 [报告]
发表于 2003-06-17 19:09 |只看该作者

你的编译器死了吗?

想用泛型的话要有泛型设计的思维

这样写才可以写得更好
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP