我有一些可以正常工作的代码,但我想确保它在 C++ 标准下始终能正常工作。
我创建了两种隐式转换为 double 的类型,并为每种类型创建了一个 sin() 函数。我对其进行了测试并调用了正确的 sin() 重载,但是否保证编译器不会决定将对象实例隐式转换为 double 并调用 math.h 函数?
此外,我的类和 sin() 重载是否在命名空间中是否重要?如果我对其中任何一个进行模板化有关系吗?
struct AngleDegrees;
struct AngleRadians;
inline double degs2Rads(double degs) { return degs * PI / 180.0; }
inline double rads2Degs(double degs) { return degs * 180.0 / PI; }
struct AngleDegrees
{
private:
double m_val;
public:
explicit AngleDegrees(double val) : m_val(val) { }
explicit AngleDegrees(const AngleRadians& rads);
operator double() const { return m_val; }
};
struct AngleRadians
{
private:
double m_val;
public:
explicit AngleRadians(double val) : m_val(val) { }
explicit AngleRadians(const AngleDegrees& degs);
operator double() const { return m_val; }
};
inline AngleDegrees::AngleDegrees(const AngleRadians& rads)
{
m_val = rads2Degs(rads);
}
inline AngleRadians::AngleRadians(const AngleDegrees& degs)
{
m_val = degs2Rads(degs);
}
inline double sin(const AngleDegrees& degs)
{
std::cout << "called sin(AngleDegrees)\n";
AngleRadians rads(degs);
return sin((double)rads);
}
inline double sin(const AngleRadians& rads)
{
std::cout << "called sin(AngleRadians)\n";
return sin((double)rads);
}