Я определяю себя как классы:
struct AngleSize {
explicit AngleSize(double radians) : size(radians) {}
double size;
};
Это имеет ряд преимуществ перед хранением угловых размеров в виде простых двойных чисел.
Преимущество 1 , позволяет определять эти 2 различных конструктора:
Vec2::Vec2(double x, double y);
Vec2::Vec2(double length, AngleSize direction);
... последний однозначно называется Vec2(1, AngleSize(5));
(хотя в этом случае статическая фабричная функция, такая как Vec2::fromPolar(1, 5)
, могла бы быть такой же хорошей?)
Преимущество 2 , более безопасное, обнаружена следующая ошибка:
double temperature = air.getTemperature();
Vec2 v(someLength, temperature);
пока не все хорошо.
Недостаток 1 , многословный и неожиданный синтаксис
Vec2::Vec2(double length, AngleSize direction) {
x = length * cos(direction.size);
y = length * sin(direction.size);
}
Тьфу, это действительно должно сказать cos(direction)
, но, не допуская небезопасного неявного преобразования, мне нужно детально получить доступ к фактическому значению.
Недостаток 2 , слишком много классов для каждой вещи , где вы проводите черту?
struct Direction { // angle between line and horizontal axis
explicit Direction(AngleSize angleSize);
AngleSize angleSize;
};
struct Angle { // defined by "starting and ending angle" unlike AngleSize
Angle(Direction startingDir, Direction endingDir);
Angle(Direction startingDir, AngleSize size);
Angle(Line line1, Line line2);
};
struct PositionedAngle {
// angle defined by two rays. this is getting just silly
PositionedAngle(Ray firstRay, AngleSize angle);
PositionedAngle(Point center, AngleSize fromAngle, AngleSize toAngle);
// and so on, and so forth.
};
// each of those being a legit math concept with
// distinct operations possible on it.
Что вы делаете в таких случаях сами?
Также, где я могу прочитать об этой проблеме? Я думаю boost
может быть что-то связано?
Обратите внимание, что это не только геометрия, она применима везде. Думаю, посикс socklen_t ...