【发布时间】:2014-10-31 13:54:13
【问题描述】:
std::sort 是通过 Compare 类参数化的模板。该函数本身将该类的一个对象作为参数,并“调用”它来比较待排序容器的元素。
我认为重要的是我们可以给 sort 一个具体的对象,而不是简单地让 sort 构造一个 Compare 对象本身。 (如果不是,请纠正我。)
现在假设我们要实现一个函数foo,它将vector<T> 和T 的比较函数作为输入:
template <class T, class Compare>
bool foo(const vector<T>& v, Compare comp);
作为此实现的一部分,我们希望对包含T 和int 对的不同向量进行排序,即对vector<pair<T, int>> 进行排序。但我们只想根据T 组件对该向量进行排序。这意味着我们希望将T 上的给定订单提升为pair<T, int> 上的订单并将该订单传递给std::sort。
如何在不使用 lambda 的情况下做到这一点?我的问题是我没有办法将T 的Compare object 提升为pair<T, int> 的一个。我只能解除Compare class 然后构造一个对象,这意味着foo 将完全忽略它的comp 参数。
谢谢。
【问题讨论】:
-
"
std::sort是通过比较类参数化的模板" 它是模板类型参数,它不必是类.例如,也可以使用函数指针类型。 -
@dyp:谢谢,但我写的是“不使用 lambdas”。
-
糟糕,对不起。我不知何故误读了相反的意思:(
-
好吧,如果你不想使用 lambda,你可以手动创建一个函数对象类型(使用类模板)。
-
这是一个 C++03 解决方案:coliru.stacked-crooked.com/a/8b12193511d526ab 在 C++11 中,您可以使用 Vlad 所示的本地类型。
标签: c++ templates higher-order-functions function-object