2013-07-02 72 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中找到等价物。