2011-10-11 80 views
1

假设我想为容器实现一些类。他们都应该实现这样的功能,如插入,删除等,所以我写了一些接口:类变通方法的虚拟模板成员

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; 

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

回答

3

您可以使用功能对象的类型擦除。但幸运的是,相应的设施已经存在!例如,就你而言,你可以使用boost::function<bool(const T&)>std::function<bool(const T&)>(支持TR1/C++ 11)作为谓词类型!

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

创建一些抽象class Predicate,其中所有具体的谓词将不得不继承。然后,才使谓词参数传递给函数:

virtual void remove(Predicate* p) = 0; 

你必须做出相关Predicate成员函数虚拟走向,让每一个具体的实施覆盖它们。