在 C++ 中重载函数时,对于以下涉及模糊类型的问题,是否有任何优雅的解决方案?我想要两种不同的类型:“距离”和“角度”,它们在语义上意味着不同的东西,但实际上可能具有相同的类型。当尝试在 C++ 中执行此操作时,我遇到了函数重载的问题:
typedef float distance;
typedef float angle;
class Velocity {
public:
Velocity(distance dx, distance dy) { /* impl */ }
Velocity(angle theta, distance magnitude) { /* impl */ }
};
当我尝试编译它时,我得到“无法重新声明构造函数”。但是(由于某种原因,我无法弄清楚)当我在我的实际应用程序代码库中执行此操作时,该类会编译,但后来当我执行类似的操作时,我会收到“对 'Velocity' 的构造函数的调用不明确” :
distance dx;
distance dy;
Velocity v(dx, dy);
这个问题有什么优雅的解决方案吗?一种不令人满意的解决方案是仅更改这些数量之一的类型
typedef double distance;
但这显然无法扩展,因为只有几种不同的浮点类型。我尝试的另一个选择是使用模板
template <typename distance, typename angle>
class Velocity {
public:
Velocity(distance dx, distance dy) : dx(dx), dy(dy) { }
Velocity(angle theta, distance magnitude) { }
};
但是如果我用相同的类型实例化它们,我会得到“'Velocity'的多个重载实例化为相同的签名'void(float,float)'”。即使这可行,它仍然会有点不满意,因为我必须Velocity
在许多地方为类型添加模板参数。