模板的半专业化

nav*_*erm 2 c++ templates

我有一个模板类

template <class dataType>
class SSDFinder
{
   dataType a;
   dataType b;
public:
   void FindSSD();
}; 
Run Code Online (Sandbox Code Playgroud)

实施是:

template<class dataType>
void SSDFinder<dataType>::FindSSD()
{
// some code. 
}
Run Code Online (Sandbox Code Playgroud)

现在我需要专门化这个函数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()来获取类型信息.许多数据结构没有提供.

Mor*_*enn 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. 
}
Run Code Online (Sandbox Code Playgroud)

虽然您仍然需要手动告诉哪些类"有2个元素",但它将与您的函数分开,易于扩展,并可在代码中的其他位置重用.

注意: std::enable_if是c ++ 11,但您可以在Boost中找到相应的内容.