我已经实现了我自己的SI单元类。使用算术运算时,生成的SI单元可以更改。例如:(米/秒)/米= 1 /秒。取决于模板参数的C++模板返回类型?
好吧,我现在也创建了一个简单的3D矢量类。这个向量应该是通用的,并且可以与我的SI单元类一起使用。所以我实现了一个简单的划分算子。 参见以下代码:
// Determine result type of Lhs/Rhs:
template < class Lhs, class Rhs >
struct TV3TypeV3Div { typedef BOOST_TYPEOF(Lhs()/Rhs()) type; };
// Vector/Vector:
template < class Lhs, class Rhs >
RobotTools::DataTypes::TV3Type< typename TV3TypeV3Div< Lhs, Rhs >::type > operator/(const RobotTools::DataTypes::TV3Type<Lhs>& lhs,
const RobotTools::DataTypes::TV3Type<Rhs>& rhs)
{
// do something useful
return RobotTools::DataTypes::TV3Type< typename TV3TypeV3Div< Lhs, Rhs >::type >(0, 0, 0);
}
// Vector/Vector
RobotTools::DataTypes::TV3Type<Tools::DataTypes::Length> vl;
vl/vl; // Ok this works
在右返回类型将通过使用TV3TypeV3Div结构来确定编译时间。这工作。
现在我想扩展运营商。我也想用标量类型来计算向量。所以我写了这个算子:
// Vector/Scalar
template < class Lhs, class Rhs >
RobotTools::DataTypes::TV3Type< typename TV3TypeV3Div< Lhs, Rhs >::type > operator/(const RobotTools::DataTypes::TV3Type<Lhs>& lhs,
const Rhs& rhs)
{
// do something useful
return RobotTools::DataTypes::TV3Type< typename TV3TypeV3Div< Lhs, Tools::DataTypes::Length >::type >(0, 0, 0);
}
// Vector/Scalar
RobotTools::DataTypes::TV3Type<Tools::DataTypes::Length> vl;
Tools::DataTypes::Length sl;
vl/sl; // Ok nice it works too
到目前为止好。问题是当我定义第二个运算符(矢量/标量)时,这个运算符是非常通用的,编译器也想将它用于Vector/Vector除法。 但由于LHS()/右轴()与它失败:未定义
LHS =工具::数据类型::长度和rhs = RobotTools ::数据类型:: TV3Type
。这是正确的,我理解给定的错误。我不明白的是编译器不使用Vector/Vector操作符。
- 有没有可能给编译器一个提示哪个运算符使用?
- 有没有可能改写操作员以满足我的要求?
我很困惑!这真的有用。我花了整整一天的时间为这个简单的解决方案:)你能解释一下多一点。我没有看到魔法。 – Mark
我已经添加了一些解释。 –
谢谢。为了很好的解释。与此同时,我在我原来的项目中尝试了你的方法。但它在多个地方出现“InvalidDivision ...”错误代码失败。我认为更新整个项目并不那么容易。所以也许我需要一些SFINAE魔术,也许通过使用提升?有任何想法吗 ? – Mark