2011-09-26 73 views
3

我正在做一些數值模擬,它很好地超載載體上的操作(類似於valarrays)。例如,我可以寫C++廣義操作員模板

template <typename T> 
vector<T> operator*(const vector<T>& A, const vector<T>& B){ 
    //blah blah 
} 

但是,如果我想概括這個模板,從而作用於兩種不同類型的載體和(潛在的)返回第三種類型是什麼?即我想寫

template <typename T, template U, template V> 
vector<V> operator*(const vector<T>& A, const vector<U>& B){ 
    //blah blah 
} 

現在,如果我用的是運營商的情況「A * B」其中A和B是不同的類型,並返回一個又一個不同的類型上面確實工作。但是,如果A和B是相同的類型,它不起作用。當然,我可以爲每個組合定義不同的模板(即僅T,或T和U,或T,U和V),但看起來很醜。有沒有一種方法可以使用上面給出的T,U和V變種的單個模板表達式,並且即使「A」,「B」和「A * B」都是相同類型(或有隻有2個不同類型的?)

+0

我沒有模板參數推導看看返回值(你不能在返回類型上重載) – sehe

回答

1

現在,上面的確,如果我使用運營商的情況 「A * B」,其中A和B是不同的,並返回一個不同類型的工作。

說實話,這是沒有意義的。你的模板根本不應該工作,因爲V不能被推導出來,而且它是第三個模板參數。如果你這樣寫:

template <typename V, template T, template U> 
vector<V> operator*(const vector<T>& A, const vector<U>& B){ 
    //blah blah 
} 

這「工作」,但只有當你明確指定V,像

operator*<double>(A, B); //where A is vector<int> and B is vector<float>, for example 

肯定要返回一個vector<V>其中V是表達T()*U()的類型。這在C++ 11中是可以做到的,但在C++ 03中並不平凡(我的意思是,你可以在最好的情況下做一些類型特徵)。下面是它是如何在C++ 11做:

template <typename T, template U> 
vector<decltype(T()*U())> operator*(const vector<T>& A, const vector<U>& B) 
{ 
    //blah blah 
} 

HTH

+0

@Kerrek SB:糟糕,複製粘貼神器:)這不是必需的。謝謝 –

+0

我也想知道一個你不知道返回類型的操作的效用。你會用這個匿名媒介做什麼?也許這很有道理,但我對此感到不安。 –

+0

@Kerrek SB:這就是auto的原因:)'auto v = A * B;' –

0

這可以通過decltype工作中的C++ 0x。

template <typename T, template U> 
vector<decltype(declval<T>() + declval<U>())> 
operator*(const vector<T>& A, const vector<U>& B){ 
    //blah blah 
} 

不使用這種機制 - 並假定T和U不提供自己的機制 - 你不能做這樣的事情。你只能處理T,U和返回類型都是相同類型的情況。但是,您可以處理原始類型 - 對於將諸如+之類的運算符應用於各種基本類型以找到提升類型的結果,存在Boost類型特徵。

+0

謝謝,這也回答了我的問題! – andyInCambridge

+0

爲什麼'+'?它不應該是'*'嗎? –

0

正如其他人指出的,你可以使用decltype來實現這一點。 C++ 0x也提供了模板common_type,它可以推導出所有模板參數都可以被強制轉換的類型,而無需任何特定的算術運算。所以如果沒有重載操作符可用於參數類型,也可以使用它。