处理函数对象

时间:2014-10-31 13:54:14

标签: c++ templates higher-order-functions function-object

std::sort是在Compare类上参数化的模板。函数本身将该类的对象作为参数,并且"调用"它来比较待分类容器的元素。

我认为重要的是我们可以给一个具体的对象排序,而不是简单地让sort构造一个Compare对象本身。 (如果没有,请纠正我。)

现在假设我们要实现一个函数foo,它将vector<T>作为输入,并T作为比较函数:

template <class T, class Compare>
bool foo(const vector<T>& v, Compare comp);

作为此实现的一部分,我们希望对包含Tint对的不同向量进行排序,即对vector<pair<T, int>>进行排序。但我们只想基于T组件对此向量进行排序。这意味着我们希望将T上的给定订单提升到pair<T, int>上的订单,并将其传递给std::sort

如何在不使用lambdas的情况下完成这项工作?我的问题是,我找不到将Compare的{​​{1}} 对象提升为T的方法的方法。我只能解除pair<T, int> ,然后构造一个对象,这意味着Compare将完全忽略其foo参数。

感谢。

1 个答案:

答案 0 :(得分:1)

您可以在函数内部定义一个局部结构吗?例如?

template <class T, class Compare>

bool foo(const vector<T>& v, Compare comp)
{
   struct NewCompare
   {
      const Compare &rc;
      NewCompare( const Conpare &comp ) : rc( comp ) {}
      NewCompare( const NewCompare &comp ) : rc( comp.tc ) {}
      bool operator ()( const std::pair<T, int> &p1, const std::pair<T, int> &p2 ) const
      {
          return rc( p1.first, p2.first );
      }
    };

    //...
}

或者您可以编写一般功能适配器。