我正在创建一个类-BST-该类可以比较需要比较器(例如std::less
)的模板节点。
树就像这样:
template<typename T, typename comparator>
class tree
{
private:
comparator compare;
public:
explicit tree (comparator functor);
};
但是我似乎找不到要在应用程序中输入的模板类型。
tree<int> my_bst (std::less<int>);
error: wrong number of template arguments (1, should be 2)
bst::tree<int> my_bst (std::less<int>);
这很有意义,因为我的模板类型不完整。
我应该如何剖析我的构造函数?
模板的那个属性叫什么?因为我发现的只是cppreference上的sort
页。
通常,我可以像这样使用sort
std::vector<int> v;
std::sort(v.begin (), v.end (), std::less<>());
如何推导较少的专业化?我该如何复制?
答案 0 :(得分:7)
为了保存自己以及所有其他想要默认行为的人,在告诉编译器类型的比较器时,您需要进行额外的击键操作,而可以默认设置它,然后仅在需要其他行为时才必须指定它
template<typename T, typename comparator = std::less<T>>
class tree
{
private:
comparator compare;
public:
explicit tree (comparator functor = comparator{});
};
默认将comparator
设置为std::less<T>
类型,并让您构造类似的类
tree<int> my_bst;
然后,如果您想使用其他类型,例如std::greater
,则可以使用
tree<int, std::greater<int>> my_bst;
现在,您必须使用
tree<int, std::less<int>> my_bst(std::less<int>{});
^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
| pass an instance of the comparator to the constructor
|
tell the compiler the type of the comparator
使用tree
制作std::less<int>
。
关于为什么可以这么做
std::vector<int> v;
std::sort(v.begin (), v.end (), std::less<>());
std::less
在C ++ 14中专门用于std::less<void>
,它提供了一个operator ()
模板化并推断出传递给它的类型。这意味着std::less<>
的对象可以比较任意两种类型,只要表达式
decltype(std::forward<T>(lhs) < std::forward<U>(rhs))
在T
和U
均为operator ()
的参数类型的情况下有效。