对lambda比较器使用decltype



我试图理解以下两种情况的区别。在这两种情况下,我都将比较器作为lambda函数引入:

auto comp = [](int x, int y) { return x%2 < y%2; };

但是,如果我想将它与排序一起使用,我可以简单地写

sort(vec.begin(), vec.end(), comp);

而对于在比较器上模板化的类,例如priority_queue,我需要一个包装器:

priority_queue<int, decltype(comp)> my_queue;

作为模板参数传递。

sort函数本身是在比较器类上模板化的,但它在没有decltype的情况下也能工作。是否存在适用于sort的隐式转换,但在第二种情况下不起作用?

这些都是关于模板参数推导的。您正在调用的std::sort的重载声明为

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );

sort(vec.begin(), vec.end(), comp);

编译器通过模板实参推导步骤,根据传递给函数的变量类型确定RandomItCompare是什么。

priority_queue的情况下,你没有得到这个,因为没有变量来推断类型。因此你必须自己指定模板参数。

也就是说,从c++ 17开始,我们现在有了类模板实参推导(CTAD),可以使用提供给构造函数的实参来推导类的模板形参。例如,如果您希望priority_queue使用std::vector<int>作为底层容器,并使用comp保持顺序,那么您可以使用

priority_queue my_queue(comp, std:vector<int>{});

相关内容

  • 没有找到相关文章

最新更新