假设我想为容器实现一些类。所有这些都应该实现诸如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的整数以及其他我想删除的时间甚至是整数。在这种情况下可以做些什么 - 在基类中声明一些模板化的东西并模拟函数的虚拟行为?
答案 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
成员函数设置为虚拟,并让每个具体实现都覆盖它们。