我有一个模板类
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()来获取类型信息.许多数据结构没有提供.
一种解决方案是编写一个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中找到相应的内容.