我尝试使用模板在C ++中实现HashMap(同时了解模板的工作原理)。为此,我需要从参数类型T :: equals()
调用方法T
。
这是我需要的简化代码:
template < class T > class Map{
public:
T* [] cells;
replaceIfEquals( int index, T a ){
if( cells[index].equals( a ); ) cells[index] = a;
};
};
假设T
应该类似于
class Point2D : public Comparable {
public:
virtual bool equals( Object o ){ Point2D p = (Point2D)o; return ( ix == p.ix ) && ( iy == p.iy ); };
};
哪个更通用类型的子类型(在Java中我会使用接口)
class Comparable {
public:
virtual bool equals( Object o ){ return false; };
};
我想我在模板概念中遗漏了一些非常基本的东西。
答案 0 :(得分:0)
忘记&#34;对象&#34;或继承&#34;等于&#34;在C ++中。这是一个Java主义。在C ++中,我们这样做:
class Point2D {
public:
// ...
bool operator==(const Point2D& other) const;
// ...
};
在地图代码中,您只需使用x == y
代替x.equals(y)
即可。请注意,您的地图当前有一个指针列表,因此您需要取消引用指针来执行该操作(也就是说,您需要执行*xPtr == *yPtr
来比较指向的值而不是地址。 / p>
答案 1 :(得分:0)
如果为is_comparable<T>
定义了operator==
,您可以制作一个返回true或false的特征T
。然后,您可以使用static_assert
在Map
类中创建编译时断言:
template<class T, class = void>
struct is_comparable
: std::false_type { };
template<class T>
struct is_comparable<T, decltype(void(std::declval<T>() == std::declval<T>()))>
: std::true_type { };
template<class T>
class Map
{
// ...
static_assert(is_comparable<T>::value, "T must be comparable");
};
如果您传递Map
未定义operator==
的类型,您将收到自定义消息的编译错误。就像迈克尔所说的那样,你就是这样用C ++做的。