Я занимаюсь научным программированием и делаю очень хороший опыт как с Boost.Units, который обеспечивает анализ размеров во время компиляции для количеств (т.е. количество меток с единицами и, следовательно, ломает множество ошибок с классическим анализом физических измерений) и используя Eigen 2 для линейной алгебры.
Однако Eigen не имеет понятия единиц, и, хотя вы можете установить скалярные величины в матрицах для Eigen, он ожидает, что умножение двух величин даст один и тот же тип, что, очевидно, неверно для единиц. Например, код типа:
using boost::units::quantity;
namespace si = boost::units::si;
Eigen::Matrix< quantity< si::length >, 2, 1 > meter_vector;
quantity< si::area > norm = meter_vector.squaredNorm();
не работает, хотя и логически корректен.
Есть ли библиотека матриц, которая поддерживает единицы? Я знаю, что в прошлом это было бы трудно реализовать, и С++ 11 и decltype
сделают это намного проще, но это было возможно с помощью С++ 03 и специализированных шаблонов.