再次,我希望C++具有較強typedef
S:在這種情況下如何使模板類型推斷工作?
#include <vector>
template<typename T>
struct A {
typedef std::vector<T> List;
};
template<typename T>
void processList(typename A<T>::List list) {
// ...
}
int main() {
A<int>::List list;
processList<int>(list); // This works.
processList(list); // This doesn't.
}
顯然,編譯器看到list
作爲std::vector<int>
而不是A<int>::List
,所以它不能匹配它是預計A<T>::List
。
在實際的情況下,它是一個較長的類型名稱,經常重複,這是一個滋擾。除了讓processList
代替接受vector
,有什麼辦法可以爲我做模板類型推斷嗎?
嗯,好點。我想我不會太在意「慣用」,因爲這只是在一個班級內部使用。通過一個(在這個簡單的例子中我忽略的引用......)這個東西本身使得在調用站點的代碼更短。 – Thomas 2010-07-08 09:48:20
爲了簡化示例,我通過值傳遞了向量。實際上,我傳遞一個const引用,當然。你的更新很整潔;不是我會用它(我不是那麼絕望),但記住它是很好的。 – Thomas 2010-07-08 10:10:56
+1,但要小心(用於編輯)標準容器沒有固定數量的參數 - 它是實現定義的,實現只需提供模板的任何額外參數的默認值,以便假定簽名的實例化目前在標準編譯。 – 2010-07-08 11:39:43