【问题标题】:Dealing with function objects处理函数对象
【发布时间】: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);

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

如何在不使用 lambda 的情况下做到这一点?我的问题是我没有办法将TCompare object 提升为pair&lt;T, int&gt; 的一个。我只能解除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


【解决方案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 );
      }
    };

    //...
}

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

【讨论】:

  • 谢谢,我没想过在本地做。但是只需要一个将订单提升到配对结构的定义(例如,作为 STL 的一部分)会很好。遵循您的解决方案需要我在每次需要时从本质上重新定义它。
  • @jingjok 你可以用同样的方法写一个通用的功能适配器。
  • 实际上那里的位置似乎并不重要。我现在从你和 dyp 的代码中意识到答案是使用状态。
  • 大概,OP 被 C++03 卡住了(否则你会使用 lambda)。在这种情况下,类不能是本地的,因为本地类型不能用作模板参数。
猜你喜欢
  • 2019-03-17
  • 2016-11-29
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
相关资源
最近更新 更多