首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Boost单元作为方法参数传递

如何将Boost单元作为方法参数传递
EN

Stack Overflow用户
提问于 2015-04-07 22:44:24
回答 1查看 242关注 0票数 0

我正在尝试在我的项目中使用Boost.Units。我主要让它工作,但我希望有一个访问器方法,允许我使用不同的缩放值来获得原始值。例如,我希望一次获得以伏为单位的值,但在另一点上,我需要以毫伏为单位的值。我可以使用conversion_factor方法转换数字。但是,我想让它更方便地使用具有默认小数位数传入的访问器。下面是我尝试使用的类的访问器方法:

代码语言:javascript
复制
virtual double get_vm(electric_potential scale = volts) { return (quantity_cast<double>(m_vm)* conversion_factor(volts, scale)); };

我尝试这样使用它:

代码语言:javascript
复制
static const auto millivolts = milli * volts;
double dblVal = get_vm(millivolts);

但是,这将不会编译。我得到以下错误:

代码语言:javascript
复制
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

我显然做错了什么,但是报告的错误很难用其中的所有模板代码来解析,以至于我不确定我做错了什么。我希望有人可能做过类似的事情,并能告诉我我在哪里走错了路?

EN

回答 1

Stack Overflow用户

发布于 2016-02-04 19:37:48

有点晚了,但也许它可以帮助寻找同样的答案的人……

在Boost.Units中,单元被实现为类型。需要注意的是,以下两个表达式的类型是不同的:

代码语言:javascript
复制
auto centiimeters = centi * meter;
auto millimeters = milli * meter;

因此,将上述内容用作函数的参数的唯一方法是将其作为模板:

代码语言:javascript
复制
template <typename T>
double get_vm (T unit) {
    return (quantity_cast<double>(m_vm)* conversion_factor(volts, unit)); 
}

用作:

代码语言:javascript
复制
double my_vm = get_vm(milli * meter);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29494405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档