处理函数对象

Dealing with function objects

本文关键字:对象 处理函数      更新时间:2023-10-16

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

我认为重要的是,我们可以给sort一个具体的对象,而不是简单地让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

不使用Lambda怎么能做到这一点?我的问题是,我看不到将TCompare对象提升为pair<T, int>的一个对象的方法。我只能提升Compare,然后构造该类的对象,这意味着foo将完全忽略其comp参数。

谢谢。

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

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 );
      }
    };
    //...
}

或者您可以编写一个通用的功能适配器。