2012-03-18 182 views
1

我經歷了很多關於這個問題的問題,但仍然沒有找到我可以使用的答案。模板類成員函數專業化?

我有一個模板類,即聲明如下:

template <typename Type, int inSize> 
class sortedVector 
{ 
    public: 
     sortedVector(); 
     int getSize(); 
     int getAmountElements(); 
     bool add(const Type &element); 

    private: 
     Type *vector; 
     int size; 
     int amountElements; 
}; 

類應該代表能夠存儲任何類型的元素的排序矢量。這是編程課程任務的一部分。到目前爲止,賦值中給出的主函數似乎將整數和類型爲Polygon的對象傳遞給函數。多邊形是我之前完成的一個類。

該矢量應該按照傳遞的多邊形對象的面積排序,或者當然,按照傳入的整數值進行排序。

爲此,我想我需要添加兩個不同的實現(const類型&元素)。一個負責將int放置到vector中的正確位置,另一個負責獲取多邊形的區域並將其插入vector中的正確位置。

我們談到AFAIK關於模板的專業化。

我已經嘗試了幾種不同的方法,但到目前爲止只是遇到了編譯器錯誤。什麼是最好的方式來實現這一目標?

+0

應該不是你的'sortedVector'不是也存儲比較仿函數? – pmr 2012-03-18 13:32:18

+0

你的意思是==?也許,我完全不熟悉這一點,但如果需要,我會在稍後添加它。我會需要什麼? :) – JKase 2012-03-18 13:35:09

回答

2

在C++中,維護排序的容器通常會有一個用於比較函子的模板參數,用於確定元素的排序順序。看看std::set例如:

template<typename Key, typename Compare = std::less<Key>, class Allocator = allocator<Key>> 
class set; 

你也許可以跳過本練習分配器。默認Compare仿函數將使用operator<,但如果我想用不同的東西我可以實例set這樣的:

typedef std::set<int, std::greater<int> > MySet; 

所以,沒有必要爲你在這裏使用的專業化。反正你怎麼能 ?你不可能專注於你的 排序向量可以使用的所有類,因爲你永遠不會知道它們中有多少個 。

所以這會使出聲明sortedVector這個樣子的:

template<typename Elem, 
     typename Compare = std::less<Elem> > 
class sortedVector { 
public: 
    // take the functor as a constructor argument in case it cannot be 
    // default constructed 
    sortedVector(Compare c = Compare()) : cmp_(c) {} 

    // ...snip... 
    void push_back(const Elem& x) { 
    cont_.push_back(x); 
    std::sort(begin(cont_), end(cont_), cmp_); 
    } 

private: 
    // trick just use a std::vector as storage and guarantee our sorted invariant 
    std::vector<Elem> cont_; 

    // we need to store the comparison functor in case it has state 
    Compare cmp_; 
}; 

#include<iostream> 
int main(){ 
    long long num; 
    std::cin>>num; 
    std::cout<<num; 
} 
+0

不幸的是,這是我從來沒有聽說過的,我認爲不應該在這種情況下使用,因爲任務的性質和限制。說實話,我可能在思考專業化的錯誤軌道上。 – JKase 2012-03-18 13:44:27

+0

這個任務如下:「在這個任務中,你將創建一個模板類SortedVector,它應該能夠存儲任何給定的類的實例或者內建的C++數據類型,如果方法add()應該返回'false'向量是滿的,然後當然有一個類應該至少有一個列表和一個給定的'主' – JKase 2012-03-18 13:47:37

+0

所以,這正是你所需要的,我已經添加了一個默認實現,儘管我認爲你需要維護存儲你自己而不是依賴於'std :: vector'。如果你不想依賴任何stdlib功能,你也可以跳過默認的'Compare'並且可以自己實現'sort'。 – pmr 2012-03-18 13:49:44