C++重载函数和隐式强制转换
C++ overloaded functions and implicit casts
我有一些代码可以正常工作,但我想确保它在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单元框架来帮助你,而不是自己编码。
相关文章:
- 构造函数和转换运算符之间的重载解析
- 如何在C++中正确重载运算符转换字符*?
- MSVC 错误:4 个重载中的任何一个都无法转换所有参数类型
- C++:从重载函数转换为 std::function
- 为什么选择转换运算符的重载?
- C++stoi:这两个重载都无法转换所有参数类型
- 为什么这个涉及重载运算符和隐式转换的C++表达式是不明确的
- C++ 函数重载不明确,没有自动类型转换
- C++ 运算符重载转换
- 派生类 插入和提取运算符重载以及基类与派生类之间的强制转换
- unordered_set使用重载运算符=设置转换
- C++:使用重载而不是动态强制转换通过基选择派生类
- 具有重载类型转换运算符的函数对象崩溃
- 类型转换运算符重载与 as 非成员函数
- 模板化转换运算符的重载解析
- 类型转换重载
- 转换重载函数是不明确的
- 联合上的类型转换重载而不重载 +=
- C++类型转换重载
- c++的强制转换重载等价