2012-11-15 41 views
0

打破我有一噸的功能被定義爲這樣的:模板功能與新的分配器

template<typename T> 
void myFunction1(vector<T>& vin); 

問題的關鍵是,我輸入一個STL向量和做一些工作。

我最近需要將默認分配器更改爲客戶分配器。這似乎除非我改變定義,以打破各功能:

template<typename T, typename Alloc> 
void myFunction1(vector<T,Alloc>& vin); 

爲了使問題更加複雜,我不會使用重載分配器在所有情況下..

這是否意味着我不得不重寫每個函數有兩個定義,一個是分配器的模板,另一個是沒有分配器的定義?我真的希望這不是答案...

回答

1

擁有一個尊重整個類模板的單個函數模板是完全足夠的。可以想像,這將做到:

template <typename T, typename Alloc> 
void myFunction1(std::vector<T, Alloc> & v); 

每個載體具有這兩個參數,無論是分配一個是否拖欠或沒有。

然而,更富有成效的成語實際上是使整個容器的模板:

template <typename V> 
void myFunction1(V & v) 
{ 
    typedef typename V::value_type value_type; 
    // ... 
} 
+0

你不應該去variadics。圖書館要求說有一個名爲'vector'的模板需要兩個類型參數;雖然允許實現添加額外的參數,但不允許它們使'vector 不起作用。如果您嘗試編寫自己的標準庫類型聲明,那麼您可能會遇到麻煩的地方。使用標準庫類型只需要按照文檔進行工作。 –

+0

@PeteBecker:你說得對。我在考慮一個不同的情況(專業化),在那裏「允許的額外論據」來咬你。不過,讓我從這篇文章中刪除它吧! –

+0

關於專業化的好處。我沒有想到這一點。 –

0

我認爲你也改變了你的模板。 但好消息是,你可以在你的模板改成這樣:

template <typename MyVector> 
void myFunction1(MyVector& vin); 
+0

當然,這種改變意味着該函數可以被任何類型調用,而不僅僅是一個「vector」。 –

2

一個簡單的解決方案可能是實現迭代器方面的功能,在標準庫算法來完成:

template <typename Iterator> 
void myFunction1(Iterator1 first, Iterator2 last) { .... } 
0

您不必提供兩個重載每個函數模板。只需提供雙參數即可。 std::vector有兩個模板參數,所以兩者都可以推導出來。