假设我有一个名为LinkedList的模板类,它还包含一个名为Sort的方法 我希望能够有一个默认比较器,假设类型T可以与<操作
但是,我希望能够覆盖其他类型的那个。
这是我正在扩展的自定义库的一部分。没有STL。
e.g。
template <class T, class Comparator<T> >
class LinkedList
{
...
Node* MergeSort(Node* list)
{
...
if (Comparator<T>(nodeA,nodeB))
...
}
...
};
typedef Pair<int, int> ListEntry;
struct sorter
{
inline sorter(){}
inline bool operator()(ListEntry const& a, ListEntry const& b)
{
return a.second < b.second;
}
};
Pair<int, int> entry;
LinkedList<ListEntry, sorter()> list;
list.PushFront( ListEntry(5,9) );
list.PushFront( ListEntry(77,5) );
list.PushFront( ListEntry(4,1) );
list.PushFront( ListEntry(8,44) );
list.PushFront( ListEntry(1,64) );
list.PushFront( ListEntry(3,5) );
n = list.MergeSort(node* n);
这大致是我班级的样子。实际上MergeSort是一个私人数据成员,但是当我愚弄并尝试使其工作时,我暂时将其公之于众。 MergeSort最终将被Sort调用。
我无法编译这个。只是想知道你通常会如何传递Functor对象。
答案 0 :(得分:2)
你不能说template <class T, class Comparator<T>>
,即有一个模板参数本身就是另一个参数的参数。像标准库那样做并使用默认参数:
template <class T, class Comparator = std::less<T>>
class MyClass
{
...
}
此外,Comparator
将成为您需要在某个时刻进行实例化的对象。同样,默认参数是关键:
void MyClass::doSomething(Foo x, Comparator comp = Comparator())
{
/* ... */
if (comp(a, b)) { /* ... */ }
/* ... */
}
答案 1 :(得分:1)
我没有看到为什么functor类型应该是列表类型的一部分的原因:如果它是直接链接列表,则排序不是不变量的一部分以及列表的内容除非专门致电MergeSort
会员时。我建议将其作为该成员的模板参数:
template<typename T>
struct LinkedList {
template<typename Functor>
Node*
MergeSort(Node* node, Functor f) {
// ...
if(f(NodeA, NodeB)) {
// ...
}
// ...
}
};