gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:15:09 26 4
gpt4 key购买 nike

我有一些代码可以正常工作,但我想确保它在 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/

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