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