Chinaunix

标题: 你的编译器死了吗? [打印本页]

作者: xuejm    时间: 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》
作者: uiibono    时间: 2003-06-13 23:03
标题: 你的编译器死了吗?
我的死了。
FreeBSD4.7, 内存128M。
作者: 无双    时间: 2003-06-13 23:05
标题: 你的编译器死了吗?
enum { result = (N<mid*mid) ? Sqrt<N,LO,mid-1>;::result
: Sqrt<N,mid,HI>;::result };
应该是这里需要的运算过多
作者: xuejm    时间: 2003-06-16 11:23
标题: 你的编译器死了吗?
这是对于模板技术的极致应用!
作者: 无双    时间: 2003-06-16 11:37
标题: 你的编译器死了吗?
过犹不及
设计程序时不一定要执意使用某个技术
而是看看它能不能更好的实现你的目标
作者: xuejm    时间: 2003-06-17 10:59
标题: 你的编译器死了吗?
是啊我在调试这本书上面的示例的时候,也发现了这个问题。对于编译效率和执行效率的权衡也是一个问题。

抛开这个示例的在便是实践上的巨大的浪费,我还是觉得至少它演示了泛型技术的巨大生命力。值得我们去学习。
作者: 无双    时间: 2003-06-17 19:09
标题: 你的编译器死了吗?
想用泛型的话要有泛型设计的思维

这样写才可以写得更好




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2