std :: less <int>的正确参数类型是什么?

时间:2018-10-01 20:41:44

标签: c++ templates

我正在创建一个类-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<>());

如何推导较少的专业化?我该如何复制?

1 个答案:

答案 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))

TU均为operator ()的参数类型的情况下有效。