2

我有一个模板类

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

实施是:

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

现在我需要根据 dataType 是否有 2 个元素(例如 x、y)或 3 个元素(例如 x、y、z)来专门化这个函数 FindSSD。

有多种方法可以让我拥有 2 或 3 个元素。当我开始专注于 3 个元素时,我可以拥有 cv::Point2i、cv::Point2d。cv::Point2f、cv::Vec 等等。

对于 3 元素类似。

有没有一种方法可以将所有特定的元素组合在一起,使得所有具有 2 个元素的数据类型只能具有 1 个专业化,而具有 3 个元素的数据类型可以具有另一个专业化,仅此而已?

这些数据类型中没有 size() 等函数,我可以找到除了尝试访问它们之外还有多少元素。例如。我不能做 dataType.type() 来获取类型信息。许多数据结构没有提供这一点。

4

1 回答 1

5

一种解决方案是编写一个特征类并使用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 中找到等价物。

于 2013-07-03T11:15:07.480 回答