C ++ sqrt包含模板,模板参数太多

时间:2014-03-27 01:40:34

标签: c++ templates

在sqrt模板功能方面遇到了一些问题(只是想尝试,我知道< cmath>赢得了瓶颈任何东西)

下面的代码给出了错误:模板参数太多

namespace {
    static const size_t ITERATIONS = 10;
}

template <typename T, T N> struct Sqrt {
    static const T value = Sqrt<T, N, 1, ITERATIONS>::value;
};
//Newtons method: A = (N / A + A) / 2 
template <typename T, T N, T A, size_t I> struct Sqrt {
    static const T value = Sqrt<T, N, (N / A + A) / 2, I - 1>::value;
};
template <typename T, T N, T A> struct Sqrt<T, N, A, 0> {
    static const T value = A;
};

由于

1 个答案:

答案 0 :(得分:1)

代码可以比你想象的简单得多。

#include <iostream>

template<int N, int M> struct Sqrt
{
   static const int value = (Sqrt<N, M-1>::value + N/Sqrt<N, M-1>::value)/2;
};

template<int N> struct Sqrt<N, 0>
{
   static const int value = N/2;
};


int main()
{
   int y = Sqrt<200, 10>::value;
   std::cout << "Sqrt(200): " << y << std::endl;

   y = Sqrt<200, 20>::value;
   std::cout << "Sqrt(200): " << y << std::endl;

   y = Sqrt<2000, 10>::value;
   std::cout << "Sqrt(2000): " << y << std::endl;

   y = Sqrt<2000, 20>::value;
   std::cout << "Sqrt(2000): " << y << std::endl;
}

下面列出的结果是近似值,因为我们只处理整数值。

Sqrt(200): 14
Sqrt(200): 14
Sqrt(2000): 44
Sqrt(2000): 44

然而,当我试图计算一个完美正方形的数字的平方根时,我得到了完美的答案。

   y = Sqrt<10000, 10>::value;
   std::cout << "Sqrt(10000): " << y << std::endl;

   y = Sqrt<10000, 20>::value;
   std::cout << "Sqrt(10000): " << y << std::endl;
Sqrt(10000): 100
Sqrt(10000): 100