2012-07-31 75 views
9

我正在爲非常小的常量大小的向量和矩陣實現一些線性代數運算的類。 Currenty,當我做:C++自動類型轉換:容器類的錯誤行爲

MyMathVector<int, 3> a ={1, 2, 3}; 
MyMathVector<double, 3> b ={1.3, 2.3, 3.3}; 
std::cout<<"First = "<<a+b<<std::endl; 
std::cout<<"Second = "<<b+a<<std::endl; 

然後First = {2, 4, 6}Second = {2.3, 4.3, 6.3},由於第二元件被澆鑄到由編譯器的第一個元素的類型。是否有任何「簡單」的方式來提供像本機C++一樣的自動投射:int + double = double,double + int = double?

非常感謝。

編輯: 隨着從答案給出的語法,我得到了運營商+工作。但我想下面的語法,以及編譯失敗,出現錯誤:expected a type, got ‘std::common_type<T, TRHS>::type’

#include <iostream> 
#include <type_traits> 

template<class T> class MyClass 
{ 
    public: 
     MyClass(const T& n) : _n(n) {;} 
     template<class TRHS> MyClass<typename std::common_type<T, TRHS>::type> myFunction(const MyClass<TRHS>& rhs) 
     { 
      return MyClass<std::common_type<T, TRHS>::type>(_n*2+rhs._n); 
     } 
     T _n; 
}; 

int main() 
{ 
    MyClass<double> a(3); 
    MyClass<int> b(5); 
    std::cout<<(a.myFunction(b))._n<<std::endl; 
} 

什麼是語法的問題?

回答

9

使用std::common_type

template <std::size_t s, typename L, typename R> 
MyMathVector<typename std::common_type<L, R>::type, s> operator+(MyMathVector<L, s> const& l, MyMathVector<R, s> const& r) 
{ 
    // do addition 
} 

OT在成員函數的情況下(在類體內,其中Ts是可見的):

template <typename TRHS> 
MyMathVector<typename std::common_type<T, TRHS>::type, s> operator+(MyMathVector<TRHS, s> const& rhs) const 
{ 
    // do addition 
} 
+0

太好了!對於+運算符,此語法運行良好,但對於需要成爲類成員的其他函數而言,它會崩潰。什麼是類成員函數的語法,其中T是類類型,TRHS是傳遞參數的類型? – Vincent 2012-07-31 16:23:24

+0

@Vincent相應地編輯了答案,顯然你不能在註釋中放置代碼塊。 – 2012-07-31 16:31:17

+0

非常感謝。我編輯了原始問題,因爲我沒有看到提供的代碼段中的語法錯誤... – Vincent 2012-07-31 16:42:02

5

使用std::common_type性狀找出正確的結果類型用於混合操作。

鏈接頁面甚至有一個與您的案例非常相似的示例。

4

絕對;使用decltype

template<typename Other> 
auto operator+(const MyMathVector<Other, size> &other) 
    -> MyMathVector<decltype(std::declval<T>() + std::declval<Other>()), size>; 

作爲一個非成員運算符,它可能會更好說你通過實際參考矢量成員的意思:

template<typename size, typename L, typename R> 
auto operator+(const MyMathVector<L, size> &l, const MyMathVector<R, size> &r) 
    -> MyMathVector<decltype(l[0] + r[0]), size>; 
+0

這要求'T'和'Other'是公開默認構造的。更好地說'std :: declval ()'等 – 2012-07-31 15:58:29

+1

@KerrekSB謝謝,修正。 – ecatmur 2012-07-31 16:06:13

相關問題