Я хотел бы использовать boost::units
в проекте использовать размерный анализ и автоматические преобразования между единичными системами. Я хотел бы выразить величины в коде стандартными техническими единицами, которые часто являются масштабированными версиями других единиц. Позвольте мне объяснить это на примере.
Предположим, я определил следующую систему
typedef make_system<
us::foot_base_unit,
us::pound_base_unit,
si::second_base_unit>::type my_system;
BOOST_UNITS_STATIC_CONSTANT(feet,length);
BOOST_UNITS_STATIC_CONSTANT(pound,mass);
Тогда единицы длины будут определены в футах, сила в lb*ft*s^-2
и давление в lb*ft^-1*s^-2
,
Тем не менее, я хотел бы использовать силу в единицах фунт-сила и давление в фунтах на квадратный дюйм, которые являются фунт-сила на квадратный дюйм. Я думал, что мог бы использовать масштабированные единицы, чтобы выразить их и использовать их взаимозаменяемо, но это не так.
Я попробовал это:
struct poundforcescale {
typedef double value_type;
double value() const { return 32.174049; }
};
typedef make_scaled_unit<force, poundforcescale>::type poundForce;
namespace boost {
namespace units {
std::string name_string(const field::poundForce&) { return "pound-force"; }
std::string symbol_string(const field::poundForce&) { return "lbf"; }
}
}
Который скомпилирован без проблем. Но потом, когда я попытался использовать масштабированный модуль, как это:
poundForce poundForceInst;
quantity<field::poundForce> f2 = 1*poundForceInst;
quantity<field::force> f3 = f2;
Компиляция завершилась неудачно с ошибкой «нет жизнеспособного преобразования». Я думал, что целью масштабированных единиц было сделать эти преобразования автоматически. А также документация заставила меня подумать, что мне нужно было только определить name_string и symbol_string, чтобы иметь возможность печатать значения в фунтах, но это
std::cout << "f2 = " << f2 << std::endl;
В результате возникла ошибка «нет элемента с именем символа в boost :: units :: scale_list_dim». Очевидно, что перегрузка этих функций не работает для масштабированных единиц.
Может быть, я должен определить другую систему, как это
typedef make_system<
us::foot_base_unit,
us::pound_force_base_unit,
si::second_base_unit>::type my_system;
Но мне все равно понадобятся преобразования, если я хочу выразить длину в футах и давление в фунтах на квадратный дюйм.
Я был бы рад, если у кого-то есть лучшее решение.
Задача ещё не решена.