2012-04-28 71 views
0

是否可以使用具有以下單例類的模板,以便能夠將portit函數與任何數據類型一起使用,而不僅僅是int?這是一個非常愚蠢的想法?使用具有單例模板的C++

class porter 
{ 
private: 
    static porter* instance; 
    porter(){} 
    ~porter(){} 
public: 
    static porter* getInstance() 
    { 
     if(!instance) 
      instance = new porter(); 
     return instance; 
    } 
    void portit(int theArray[]) 
    { 
     //sort array someway 
    } 
}; 

porter* porter::instance=NULL; 
+0

這取決於。你想每個模板類型有一個單例嗎? – Cameron 2012-04-28 19:44:03

+4

使用單身人士 - >我沒有同情心。 – Puppy 2012-04-28 19:47:58

+0

@Cameron在這個階段我不介意,理想情況下會有一個對象,我可以將不同類型的變量發送到相同的功能,但如果我需要單獨的單身人士多數民衆贊成在。 – 2012-04-28 19:52:00

回答

1

你可以使用函數模板

喜歡的東西

... 
template <typename T> 
void portit(T theArray[]) 
{ 
    //sort array someway 
} 
... 
2

單身不好,但起碼你可以使用一個簡單的實現:

class porter { 
public: 
    static porter& instance() { static porter P; return P; } 

    template <typename T, size_t N> 
    void portit(T (&array)[N]) { 
     std::sort(array, array + N); 
    } 

private: 
    porter() = default; 
    ~porter() = default; 
}; 

// usage 
porter::instance().portit(somearray); 

中當然,使用這樣的單例只是沒有意義。比較多久,它是寫,用更好的實現使用:

template <typename T, size_t N> 
void sort(T (&array)[N]) { std::sort(array, array + N); } 

// usage 
sort(somearray); 
+0

我認爲「哼唱鳥」想要參數化類型不是大小。而且根本沒有提示使用C++ 11 – 2012-04-28 20:11:58

+0

@stefanbachert:對不起,我不知道怎麼在通用版本中正確使用它,但不是在單例中。修補。 – 2012-04-28 20:20:08

0

所以像...

template <typename T> 
class porter<T> { 
    public: 
      template <typename T> 
      static porter<T> * getInstance() { 

      } 
    private: 
      static porter<T> * instance; 
} 

???注意:這可能不會編譯。自從我涉足模板以來已經有一段時間了。

這絕對是可能的,但在我看來,你應該在開始編碼之前真正考慮整個事物的設計,特別是如果你想在課堂上有另一種模板類型。

至於你想要一個單一的每個類,還是一個單一的所有實例...好吧,這有點複雜。