C ++ Template类函数作为模板参数

时间:2015-07-24 07:30:43

标签: c++ templates priority-queue standard-library

在我需要创建数据结构的意义上,实现一个行为(就模板部分而言)的类(如模板部分所关注的)的正确方法是什么,就像我需要创建数据结构一样(参数为一个普通的模板,这部分是好的)但另外还有一个比较函数,我想作为模板参数传递。 如何实现? 感谢

编辑:请求的伪代码(在评论中)

template <class T, "syntax for the compare function?">
class myclass
{ 
'I have to refer in some way to the compare function here?'
... }

myclass:: myfunctionusingcomparefunction(){
  if('how to use the compare function here?'){...
}else{...}
}

EDIT2:更好的解释

我所问的是如何实现一个能够比较(或应用函数)类的模板类型的类。 我提到了标准模板类的优先级队列类,因为它允许选择一个模板类来覆盖operator()来比较元素(在有序插入中是必需的): 在std :: priority_list情况下,第二个模板参数是比较器类。

priority_list<ObjectType, ObjectComparatorType> myQueue;

2 个答案:

答案 0 :(得分:0)

基本上,只有一个比较函数类型的成员,并且有一个构造函数,它接受对该类型的引用,以便在需要时可以传递一个函数指针/ lambda / std::function。以下是GNU libstdc ++为std::priority_queue做的事情(删除了无关的位):

template <class _Tp, class _Sequence = vector<_Tp>, 
          class _Compare = less<typename _Sequence::value_type> >
class  priority_queue {
protected:
  _Sequence c;
  _Compare comp;
public:
  explicit priority_queue(const _Compare& __x) :  c(), comp(__x) {}

答案 1 :(得分:0)

好的,考虑到优先级列表的示例,我的问题的解决方案可以是:我的模板类有三个模板参数,priority_queue对象的类型,优先级对象的类型和比较器类必须覆盖operator()才能比较优先级对象。 比较器类中给出的比较器类的对象在构造函数

中给出

priorityQueue.hpp

template <class T, class Prio, class Comp>
class priorityQueue{
    template <class T, class Prio>
    class Node{
        T elem;
        Node *next;
        Prio priority;

        public:
        Node(T e, int p) : elem(e), priority(p) {}
    };

    /*class priorityExc{
    public:
        const char* what(){ return "Priority must be in [0, 10]";}
    };*/

    class emptyExc{
    public:
        const char* what(){ return "No element to remove";}
    };


    Node<T, Prio> *head;
    int len;
    Comp comparator; //must overload the operator()

    public:
    priorityQueue(Comp cmp) : comparator(cmp), len(0) {}
    void insert (T myElem, Prio myPriority);// throw (priorityExc);
    T remove() throw (emptyExc);
};

使用这种方法,insert方法的实现,以优先级顺序方式在队列中插入元素,可能如下:

template <class T, class Prio, class Comp>
void priorityQueue<T, Prio, Comp>::insert(T myElem, Prio myPriority) //throw (priorityExc)
{
    //if(myPriority > 10 || myPriority < 0) throw priorityExc;
    Node<T, Prio> *node = new Node(myElem, myPriority);
    if(head == 0){
        head = node;
        head->next = 0;
    }
    else{
        Node *temp = head, *p = head;
        while(comparator(temp->priority, node->priority) > 0){
            p = temp;
            temp = temp->next;
        }
        p->next = node;
        node->next = temp;
    }
}