电源模板编码

时间:2019-04-01 21:34:48

标签: c++

我想编写一个用于求幂的模板函数pow()

我想在模板函数上写专门化的文字。

-如果指数是整数: 如果基数为2:使用按位移位 否则:使用循环取幂

-否则: 使用std::pow()并将操作数的std::common_type用作    返回类型。

这是供代码评审使用的,我尝试了无数次调整,但无法正常工作。

这是我的代码:

namespace math {
template <typename T, typename U>
T Pow(const T& base,const U& exponent) {
    {
        return std::pow(base, exponent);
    }
};

template <typename T>
T inline pow(const T& base, int exponent) {
    T x = 1;
    if (base == 2) {
        return (base << exponent) / 2;
    }else{
        for (int i = 0; i < exponent; i++) {
            x = base * x;
        }
        return x;
    }

};
template <typename t>
t inline pow(double x, const t y)
{
    return std::pow(x, y);
}

}

应计算以下代码:

#include <cmath>
#include <iomanip>
#include <iostream>
#include "pow.h"

int main() {

    // integer base, integer exponent
    std::cout << math::pow(12,2) << std::endl;
    std::cout << math::pow(2, 12) << std::endl;
    std::cout << math::pow(12, 2.1) << std::endl;
    std::cout << std::setprecision(10) << math::pow(12.1231, 4) << std::endl;
    int x;
        std::cin >> x;
    return 0;
}

对于每个应为的答案

输出:

  144
  4096
  184.621
  21600.04969

但是我给:

144
4096
144 (or error!)
error!

2 个答案:

答案 0 :(得分:0)

您可以这样做:

namespace math {

    template <typename T>
    T pow(const T& base, int exponent) {
        T x = 1;
        if (base == 2) {
            return 1U << exponent;
        }else{
            for (int i = 0; i < exponent; i++) {
                x = base * x;
            }
            return x;
        }

    }

    template <typename T>
    std::common_type_t<double, T> pow(T x, double y)
    {
        return std::pow(x, y);
    }
}

Demo

答案 1 :(得分:0)

您真的不是想要通过重复乘以基数来计算整数指数。这不仅非常慢(对于所有指数,但最小的指数除外),而且numerically unstable也非常慢,因此将是不准确的。另外-负权力呢?在我看来,您似乎还没有完全考虑这个问题。

但是要解决您的具体问题:我将尽量避免依赖重载集解析的复杂性。写一个:

template <typename T, typename U>
T Pow(const T& base, const U& exponent);

并按照您的喜好进行调度。例如,使用

if (std::is_integral_v<U>) { /* call one variant */ }
else { /* call another variant */ }

如果使用if constexpr,则可能只将所有代码包含在同一函数中。