C++重载函数和隐式强制转换

C++ overloaded functions and implicit casts

本文关键字:转换 重载 函数 C++      更新时间:2023-10-16

我有一些代码可以正常工作,但我想确保它在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.htmlhttp://www.ogre3d.org/docs/api/html/classOgre_1_1Degree.html

至于函数的命名,请查看ADL:http://en.wikipedia.org/wiki/Argument-dependent_name_lookup您可以将类和sin函数放在同一个名称空间中。

特定的重载将比使用加倍转换更好地匹配(或者如果不需要添加const,则更准确),因此将调用正确的版本。

也就是说,将代码放在名称空间中,让ADR找到正确的函数,以避免任何可能的混淆。

编辑:你可以考虑使用boost单元框架来帮助你,而不是自己编码。