我想编写一个用于求幂的模板函数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!
答案 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);
}
}
答案 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
,则可能只将所有代码包含在同一函数中。