Я хотел бы реализовать блок percent
с Boost.Units, чтобы безразмерная величина (например, отношение) могла быть представлена в виде процента. Я успешно реализовал преобразование между единицами массовой плотности, но то же самое не работает для безразмерных единиц. Вот мой код (при условии, using namespace boost::units;
):Использование Boost.Units для определения процента
//
// gram per milliliter (g mL^-1)
//
namespace my {
struct gram_per_milliliter_base_unit :
base_unit<gram_per_milliliter_base_unit, mass_density_dimension, 1>
{
static std::string name() {return "gram per milliliter";}
static std::string symbol() {return "g mL^-1";}
};
typedef gram_per_milliliter_base_unit::unit_type gram_per_milliliter_unit;
BOOST_UNITS_STATIC_CONSTANT(gram_per_milliliter, gram_per_milliliter_unit);
BOOST_UNITS_STATIC_CONSTANT(grams_per_milliliter, gram_per_milliliter_unit);
}
BOOST_UNITS_DEFINE_CONVERSION_FACTOR(
my::gram_per_milliliter_base_unit, si::mass_density, double, 1.0e3
); // 1 g mL^-1 == 1e3 kg m^-3 (SI unit)
BOOST_UNITS_DEFAULT_CONVERSION(my::gram_per_milliliter_base_unit, si::mass_density);
//
// percentage (%)
//
namespace my {
struct percent_base_unit :
base_unit<percent_base_unit, dimensionless_type, 2>
{
static std::string name() {return "percent";}
static std::string symbol() {return "%";}
};
typedef percent_base_unit::unit_type percent_unit;
BOOST_UNITS_STATIC_CONSTANT(percent, percent_unit);
}
BOOST_UNITS_DEFINE_CONVERSION_FACTOR(
my::percent_base_unit, si::dimensionless, double, 1.0e-2
); // 1 % == 1e-2 (SI dimensionless unit)
BOOST_UNITS_DEFAULT_CONVERSION(my::percent_base_unit, si::dimensionless);
В разделе «грамм на миллилитр» работает, как ожидалось: я могу скомпилировать этот код (предполагая, что using namespace my;
а):
quantity<gram_per_milliliter_unit> q1my(3*grams_per_milliliter);
quantity<si::mass_density> q1si(q1my);
quantity<gram_per_milliliter_unit> q1back(q1si);
Но следующий сбой компилировать на обоих преобразований:
quantity<percent_unit> q2my(3*percent);
quantity<si::dimensionless> q2si(q2my);
quantity<percent_unit> q2back(q2si);
G ++ выходы: no matching function for call to 'conversion_factor(..., ...)'
.
Связано это с тем фактом, что dimensionless_type
, по-видимому, является маркером для конца списков типов?
Любая помощь или предложение были бы весьма признательны. Спасибо.
Какой отличный ответ! Благодарю. –