作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些代码可以正常工作,但我想确保它在 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);
}
最佳答案
我会删除隐式转换并改用成员函数。当然,这些类的原因是为了避免变量可能位于一个或另一个单元中的问题?
看一下Ogre框架,例如: http://www.ogre3d.org/docs/api/html/classOgre_1_1Radian.html http://www.ogre3d.org/docs/api/html/classOgre_1_1Degree.html
至于函数的命名空间,请查看 ADL:http://en.wikipedia.org/wiki/Argument-dependent_name_lookup您可以将类和 sin 函数放在同一个命名空间中。
关于C++ 重载函数和隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18520320/
我是一名优秀的程序员,十分优秀!