Смешивание масштабированных и производных единиц без повышения :: единиц

Я хотел бы использовать 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;

Но мне все равно понадобятся преобразования, если я хочу выразить длину в футах и ​​давление в фунтах на квадратный дюйм.

Я был бы рад, если у кого-то есть лучшее решение.

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]