我正在尝试使用像这样的增强单位来构建一个带尺寸的矢量类,
//vector will be constructed vec<si::length> v(10, 1.0*si::metre);
template<typename dimension>
class vec
{
public:
//constructor setting all values to q.
vec(const size_t, const boost::units::quantity<dimension> q)
//etc
}
除了operator*=
和operator/=
进行元素乘法和除法之外,一切正常。由于这些不会改变维度,因此它们仅在乘以/除以无量纲数量时才有意义:我正在努力寻找未锁定到特定系统(例如si或cgs单位)的任意无量纲数量。
我想要类似的东西,
/** Multiply a dimensionless vector. */
vec<dimension>&
operator*=(const vec<boost::units::dimensionless_type>& b);
或者某些元编程魔法(我注意到boost :: units :: is_dimensionless存在,但我不知道如何使用它,因为我不熟悉一般的元编程技术)
template<typename dimension>
template<typename a_dimensionless_type>
vec<dimension>&
vec<dimension>::operator*=(const vec<a_dimensionless_type>& b){
//some compile time check to make sure that a_dimensionless_type is actually dimensionless?
//the rest of the function
}
我想要以下示例来编译
vec<si::dimensionless> d(10, 2.0);
vec<si::length> l(10, 2.0*si::metre);
l*=d;
vec<cgs::dimensionless> d2(10, 2.0);
vec<cgs::length> l2(10, 2.0*cgs::centimetre);
l2*=d2;
答案 0 :(得分:4)
好的,在检查了库的详细信息(并了解了BOOST_MPL_ASSERT)后,结果非常简单。我对图书馆设计师的称赞。
template<typename a_dimensionless_type>
vec<dimension>&
operator*=(const vec< a_dimensionless_type >& b)
{
BOOST_MPL_ASSERT(( boost::units::is_dimensionless<boost::units::quantity<a_dimensionless_type> > ));
//the rest of the function
};
答案 1 :(得分:0)
我可能会误解Boost细节,但传统上double
是无量纲类型。