Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板的半专门化_C++_Templates - Fatal编程技术网

C++ 模板的半专门化

C++ 模板的半专门化,c++,templates,C++,Templates,我有一个模板类 template <class dataType> class SSDFinder { dataType a; dataType b; public: void FindSSD(); }; 模板 SSDFinder类 { 数据类型a; 数据类型b; 公众: void FindSSD(); }; 实施计划如下: template<class dataType> void SSDFinder<dataType>::Find

我有一个模板类

template <class dataType>
class SSDFinder
{
   dataType a;
   dataType b;
public:
   void FindSSD();
}; 
模板
SSDFinder类
{
数据类型a;
数据类型b;
公众:
void FindSSD();
}; 
实施计划如下:

template<class dataType>
void SSDFinder<dataType>::FindSSD()
{
// some code. 
}
模板
void SSDFinder::FindSSD()
{
//一些代码。
}
现在我需要专门化这个函数FindSSD,这取决于数据类型是有2个元素,例如x,y还是3个元素,例如x,y,z

我可以通过多种方式拥有2或3个元素。当我开始专门处理3个元素时,我可以使用cv::Point2i、cv::Point2d。cv::Point2f、cv::Vec等

对于3元素也是如此

是否有一种方法可以将所有特定的数据类型合并在一起,这样所有包含2个元素的数据类型只能有1个专门化,包含3个元素的数据类型可以有另一个专门化,仅此而已


在这些数据类型中没有size()etc函数可以让我找到除了试图访问它们之外还有多少元素。例如,我无法执行dataType.type()来获取类型信息。许多数据结构没有提供这种功能

一种解决方案是编写一个traits类并在以下情况下使用
std::enable\u:

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个元素
{static const bool value=false;};
模板
结构有2个元素
{static const bool value=true;};
模板
结构有2个元素
{static const bool value=true;};
模板
void SSDFinder::FindSSD()
{
//一些代码。
}
虽然您仍然需要手工判断哪些类“有2个元素”,但它将与您的函数分离,易于扩展,并且可以在代码中的其他地方重用


注意:
std::enable_如果
是c++11,但是你可以在Boost中找到等效项。

如果不检查具有特定名称的成员,我认为这是不可能的。即使我可以在尝试访问第三个元素时重写segfault,我也可以编写一个快速函数。即使这看起来很牵强在这种情况下,你需要专门化这个类,而不是成员函数。哦,这个类太大了,有太多的函数需要专门化。但是如果我专门化一个类,我可以做部分专门化吗?怎样?