【问题标题】:C++ sqrt with templates, too many template arguments [closed]带有模板的C++ sqrt,模板参数太多[关闭]
【发布时间】:2014-03-27 01:40:34
【问题描述】:

在使用 sqrt 模板函数时遇到了一些问题(只是想尝试一下,我知道 不会成为任何瓶颈)

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

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;
};

谢谢

【问题讨论】:

  • 您的意思是要有一个variadic template 参数列表吗?
  • 当我有一个接受 4 个参数的模板并且我还传递了 4 个参数时,我只是不确定为什么会收到“模板参数过多”错误。
  • 显示确切的错误和Sqrt 的用法,否则我们不会相信你。
  • Sqrt 模板类的名称是唯一的,并且您有前面的 template &lt;typename T, T N&gt; struct Sqrt 声明,它接受 2 个参数。您要么需要使用适当的模板参数默认值,要么需要使用提到的 ellpsis (...) 来指定可变参数模板参数列表。
  • @CaptainObvlious 不,那个时候没有那种健忘;)...

标签: c++ templates


【解决方案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;
}

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

平方(200):14 平方(200):14 平方(2000):44 平方(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;
平方(10000):100 平方(10000):100

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多