2013-07-02 71 views
2

我有一個模板類模板半專業化

template <class dataType> 
class SSDFinder 
{ 
    dataType a; 
    dataType b; 
public: 
    void FindSSD(); 
}; 

實現如下:

template<class dataType> 
void SSDFinder<dataType>::FindSSD() 
{ 
// some code. 
} 

現在我需要專注這個功能FindSSD取決於是否的dataType有2個元素例如x,y或3元素,例如x,y,z。

有多種方式可以有2或3個元素。當我開始專注於3個元素時,我可以有cv :: Point2i,cv :: Point2d。 cv :: Point2f,cv :: Vec等。

類似地爲3個元素。

有沒有辦法將所有具體的東西放在一起,這樣所有具有2個元素的數據類型可以只有1個專業化,而3個元素可以有另一個專業化,那就是所有?

這些數據類型中沒有size()等函數,我可以找到除嘗試訪問它們之外還有多少個元素。例如。我無法做dataType.type()來獲取類型信息。許多數據結構不提供這一點。

+0

如果不檢查具有特定名稱的成員,我不認爲這是可能的。 – chris

+0

即使我可以在嘗試訪問第三個元素時重寫段錯誤,我也可以編寫一個快速函數。即使這在這種情況下看起來很 – navderm

+0

,你需要專門的類,而不是成員函數 – cppguy

回答

5

一個解決辦法是寫一個traits類和使用std::enable_if

template<typename T> 
struct has_2_elements 
    { static const bool value = false; }; 

template<> 
struct has_2_elements<cv::Point2i> 
    { static const bool value = true; }; 

template<> 
struct has_2_elements<cv::Point2d> 
    { static const bool value = true; }; 

template<class dataType, typename = typename std::enable_if<has_2_elements<dataType>::value, void>::type> 
void SSDFinder<dataType>::FindSSD() 
{ 
    // some code. 
} 

雖然你仍然必須手工告訴哪些類「有2個元素」,它會從你的功能分開,易於在您的代碼的其他地方擴展並重用。

注意:std::enable_if是C++ 11,但您可以在Boost中找到等價物。