模板的半专业化

时间:2013-07-02 23:52:51

标签: c++ templates

我有一个模板类

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个元素的dataType只能有1个特化,而3个元素可以有另一个特化,那就是全部?

这些dataTypes中没有size()等函数可供我查找除尝试访问它们之外的元素数量。对于前者我无法使用dataType.type()来获取类型信息。许多数据结构没有提供。

1 个答案:

答案 0 :(得分: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中找到相应的内容。