类变通方法的虚拟模板成员

时间:2011-10-11 10:09:55

标签: c++

假设我想为容器实现一些类。所有这些都应该实现诸如insert,remove等功能。所以我写了一些接口:

template <class T>
class ContainerInterface {
public:
   virtual void insert(T element) = 0;

   template<class Predicate>
   virtual void remove(Predicate p) = 0; 
};

现在我可以写下这样的内容:

template <class T>
class MyVector : public ContainerInterface<T>{};

template <class T>
class MyList : public ContainerInterface<T>{};

我确信MyVector和MyList必须实现插入和删除功能。但是,有错误:

error: templates may not be ‘virtual’

它来自:

template<class Predicate>
virtual void remove(Predicate p) = 0; 

当我定义一些容器时我不知道谓词,我也没有把删除对象绑定到容器类的任何意义,例如有一次我可以传递Predicate来删除小于50的整数以及其他我想删除的时间甚至是整数。在这种情况下可以做些什么 - 在基类中声明一些模板化的东西并模拟函数的虚拟行为?

2 个答案:

答案 0 :(得分:3)

您可以对函数对象使用类型擦除。但幸运的是,适当的设施已经存在!例如,在您的情况下,您可以使用boost::function<bool(const T&)>std::function<bool(const T&)>(支持TR1 / C ++ 11)作为谓词类型!

virtual void remove(std::function<bool(const T&)> p);

答案 1 :(得分:1)

创建一些抽象的class Predicate,所有具体的谓词都必须从中继承。然后,只需使谓词成为函数的参数:

virtual void remove(Predicate* p) = 0;

当然,您必须将相关的Predicate成员函数设置为虚拟,并让每个具体实现都覆盖它们。