2015-01-12 74 views
0

我有疑問,它正確地支持不同類型的自定義類的運營商? 假設我們有這樣的:支持重載操作符的不同類型?

template<class T> 
class C { /* Class implemantation */ } 

int main() { 

    C<int> someObject; 
    C<double> otherObject; 

    std::cout << someObject + otherObject; 

} 

這是正確的,以支持運營商+的C對象OT類型爲int和double類型的C對象?

+0

C一般支持這兩種類型嗎?是否有一種有意義的方式來爲這兩種類型實現'+'運算符? – IllusiveBrian

+0

這取決於你。你可以使它自動工作。你可以這樣做,用戶需要製作一個static_cast(轉換運算符)。或者你可以禁止它。自動化的問題是哪種類型應該優先? –

回答

2

是否或其邏輯正確與否取決於您如何設計類,希望您的類被使用。添加someObjectotherObject是否合乎邏輯?添加23.5是有道理的,但是沒有說明是否適合您的代碼。作爲一個反例,您不能添加basic_string<char>basic_string<wchar> - 由於您必須存儲相同類型的字符,因此添加沒有任何意義 - 但您可以可以對於任何T添加兩個basic_string<T>

你當然可以編寫代碼來做到這一點,但是要確定??

template <typename T> 
class C { 
    .. 
    template <typename U> 
    C<??> operator+(const C<U>& rhs) { 
     // .. 
    } 
}; 
+0

感謝您的回答,它非常有啓發性。對於第一時刻,我認爲我應該只處理相同類型的對象,並且只支持相同類型的運算符。 –

0

如果你想要一個特定運營商作用於類的特定類型的專業化,你可以寫一個專門的操作符重載,例如:

template<class T> 
class C { /* implementation */ }; 

C<double> operator+ (C<int> a, C<double> b) 
{ 
    C<double> ret; 
    // Do something to ret given a and b 
    return ret; 
} 

// Lets make it commutative (is that the right word?) 
C<double> operator+ (C<double> a, C<int> b) 
{ 
    return b + a; 
} 

int main(int argc, char** argv) 
{ 
    C<int> a; 
    C<double> b; 

    C<double> ret1 = a + b; 
    C<double> ret2 = b + a; 

    return 0; 
} 

這只是取決於哪些行爲你想要實現。

+0

嘿!謝謝!它非常有幫助。有沒有一種模板專業化的方式來實現你的消化? –

+0

也許,但這取決於你想要做什麼。 – ilent2

相關問題