在我需要创建数据结构的意义上,实现一个行为(就模板部分而言)的类(如模板部分所关注的)的正确方法是什么,就像我需要创建数据结构一样(参数为一个普通的模板,这部分是好的)但另外还有一个比较函数,我想作为模板参数传递。 如何实现? 感谢
编辑:请求的伪代码(在评论中)
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;
答案 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;
}
}