Как передать блок Boost в качестве параметра метода

Я пытаюсь использовать Boost.Units в моем проекте. В основном это работает, но я хотел бы иметь метод доступа, который позволит мне получить необработанное значение, используя различные значения масштабирования. Например, я хотел бы получить значение в вольтах один раз, но в другой момент мне нужно значение в милливольтах. Я могу конвертировать числа, используя метод translation_factor. Тем не менее, я хотел бы сделать его более удобным для использования с аксессором, которому передан масштаб по умолчанию. Вот метод аксессора для моего класса, который я пытаюсь использовать:

virtual double get_vm(electric_potential scale = volts) { return (quantity_cast<double>(m_vm)* conversion_factor(volts, scale)); };

Я пытаюсь использовать это так:

static const auto millivolts = milli * volts;
double dblVal = get_vm(millivolts);

Однако это не скомпилируется. Я получаю следующую ошибку:

1>IF_base_cell_type.cpp(31): error C2664: 'double IF_base_cell_type::get_v_rest(boost::units::si::electric_potential)' : cannot convert argument 1 from 'const boost::units::unit<boost::units::list<boost::units::dim<DT1,boost::units::static_rational<2,1>>,boost::units::list<boost::units::dim<Derived,boost::units::static_rational<1,1>>,boost::units::list<boost::units::dim<DT3,boost::units::static_rational<-3,1>>,boost::units::list<boost::units::dim<DT4,boost::units::static_rational<-1,1>>,boost::units::dimensionless_type>>>>,boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<T,L>,boost::units::list<boost::units::dim<DT1,boost::units::static_rational<2,1>>,boost::units::list<boost::units::dim<Derived,boost::units::static_rational<1,1>>,boost::units::list<boost::units::dim<DT3,boost::units::static_rational<-3,1>>,boost::units::list<boost::units::dim<DT4,boost::units::static_rational<-1,1>>,boost::units::dimensionless_type>>>>,boost::units::list<boost::units::scale_list_dim<Scale>,boost::units::dimensionless_type>>>,void>' to 'boost::units::si::electric_potential'
1>          with
1>          [
1>              DT1=boost::units::length_base_dimension
1>  ,            Derived=boost::units::mass_base_dimension
1>  ,            DT3=boost::units::time_base_dimension
1>  ,            DT4=boost::units::current_base_dimension
1>  ,            T=boost::units::heterogeneous_system_dim<boost::units::si::meter_base_unit,boost::units::static_rational<2,1>>
1>  ,            L=boost::units::list<boost::units::heterogeneous_system_dim<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit,boost::units::scale<10,boost::units::static_rational<3,1>>>,boost::units::static_rational<1,1>>,boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::second_base_unit,boost::units::static_rational<-3,1>>,boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::ampere_base_unit,boost::units::static_rational<-1,1>>,boost::units::dimensionless_type>>>
1>  ,            Scale=boost::units::scale<10,boost::units::static_rational<-3,1>>
1>          ]
1>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

Я, очевидно, что-то делаю не так, но сообщаемая ошибка настолько сложна для анализа всего кода шаблона, что я не уверен, что делаю неправильно. Я надеялся, что кто-то мог сделать что-то подобное и смог бы сказать мне, где я сбился с пути?

0

Решение

Немного поздно, но, возможно, это поможет кому-то найти тот же ответ …

В Boost.Units модули реализованы как типы. Важно отметить, что тип следующих двух выражений различен:

auto centiimeters = centi * meter;
auto millimeters = milli * meter;

Поэтому единственный способ использовать вышесказанное в качестве аргумента функции — это сделать ее шаблоном:

template <typename T>
double get_vm (T unit) {
return (quantity_cast<double>(m_vm)* conversion_factor(volts, unit));
}

Использовать как:

double my_vm = get_vm(milli * meter);
0

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