Существуют ли элегантные решения следующей проблемы, включающей неоднозначные типы при перегрузке функций в 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
.