从模板类(C ++)的方法中调用类型参数的方法

时间:2014-12-28 23:32:59

标签: c++ templates inheritance hashmap

我尝试使用模板在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; };
};

我想我在模板概念中遗漏了一些非常基本的东西。

2 个答案:

答案 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_assertMap类中创建编译时断言:

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 ++做的。