我已經實現了我自己的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