gpt4 book ai didi

c++ - 在用它执行算术时隐式地将对象转换为浮点类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:31 25 4
gpt4 key购买 nike

假设我们有一个全局对象 pi,我们想根据上下文将其隐式转换为 floatdouble。以下不起作用:

#include <cmath>

class Pi {
public:
Pi() {}

operator float() const {
return std::atan(1.0f)*4.0f;
}

operator double() const {
return std::atan(1.0)*4.0;
}
};

const Pi pi;

#include <iostream>
#include <iomanip>

int main() {
std::cout << std::setprecision(50) << pi * 1.0f << std::endl;
std::cout << std::setprecision(50) << pi * 1.0 << std::endl;
}

它不起作用的原因是编译器不知道它是否应该将 pi 隐式转换为 floatdouble .但是,假设我们总是希望它在二元算术运算符中转换为另一个操作数的类型。在 C++11 或更高版本中是否有一些优雅的方法来实现它,或者我应该重载所有算术运算符?类似的东西:

class Pi {
public:
Pi() {}

float operator*(float x) const {
return (std::atan(1.0f)*4.0f) * x;
}

double operator*(double x) const {
return (std::atan(1.0)*4.0) * x;
}

//...
};

或者您能否想出一个更优雅的解决方案,将全局对象隐式转换为适合上下文的类型?

最佳答案

您的第一次尝试很接近。让我们在类外添加一个模板化的 * 运算符:

template<typename T>
T operator*(const Pi& pi, T&& other)
{
return static_cast<T>(pi) * std::forward<T>(other);
}

现在可以了。 Live Demo


完整代码

#include <cmath>
#include <iostream>
#include <iomanip>

class Pi {
public:
Pi() {}

operator float() const {
return std::atan(1.0f)*4.0f;
}

operator double() const {
return std::atan(1.0)*4.0;
}
};

const Pi pi;

template<typename T>
T operator*(const Pi& pi, T&& other)
{
return static_cast<T>(pi) * std::forward<T>(other);
}

int main() {
std::cout << std::setprecision(50) << pi * 1.0f << std::endl;
std::cout << std::setprecision(50) << pi * 1.0 << std::endl;
}

输出:

3.1415927410125732421875
3.141592653589793115997963468544185161590576171875


如果您想真正严格地了解 T 的替代品,请查看 type_traits 内的 std::enable_ifstd::is_floating_point

关于c++ - 在用它执行算术时隐式地将对象转换为浮点类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30937434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com