【问题标题】:struct comparator constructor vs operator () in c++c++中的结构比较器构造函数与运算符()
【发布时间】:2021-01-01 15:14:50
【问题描述】:

我有这个代码:

struct PointComparator
{
   explicit PointComparator(const Point& lowest)
      : m_lowest(lowest)
   {}
   
   bool operator()(const Point& a, const Point& b)
   {
      std::cout << m_lowest[0] << std::endl;
      return; // TODO
   }

private:
   Point m_lowest;
};

// in another function:
Point lowestPoint;  // (get this from somewhere)
std::sort(points.begin(), points.end(), PointComparator(lowestPoint));

我只是对显式关键字感到困惑。当我做一个正常的排序时,我会调用类似sort(sort(points.begin(), points.end(), compar())的东西,而compar()指向bool operator()(const Point&amp; a, const Point&amp; b)函数,但现在PointComparator(lowestPoint)指的是构造函数,那么它是如何工作的呢?

【问题讨论】:

  • 它不是“引用构造函数”,它只是构造一个匿名对象,恰好使用了您编写的单参数构造函数。有什么特别令人困惑的?为什么你认为explicit 会让人更加困惑?

标签: c++ struct constructor operator-overloading comparator


【解决方案1】:

当我进行正常排序时,我会调用类似sort(sort(points.begin(), points.end(), compar()) 的东西,而compar() 指向bool operator()(const Point&amp; a, const Point&amp; b) 函数,[...]

实际上,没有。传递给sort 的第三个参数是一个比较器。它可以是具有operator() 的函数对象。您没有将其 operator() 传递给算法。

当你写作时:

std::sort(points.begin(), points.end(), PointComparator(lowestPoint));

这差不多

PointComparator compare(lowestPoint);
std::sort(points.begin(), points.end(), compare);

PointComparator(lowestPoint) 正在调用构造函数。创建的对象被传递给sort,并且仅在内部sort 调用operator()

这里的explicit 仅表示从PointPointComparator 的隐式转换被阻止。它对您的代码没有真正的影响。

【讨论】:

    【解决方案2】:

    当我进行正常排序时,我会调用类似 sort(sort(points.begin()、points.end()、compar()) 之类的东西,compar() 指向 bool operator()(const Point& a, const Point& b) 函数

    不,它没有。 compar() 是值初始化的临时对象的语法。

    但是现在 PointComparator(lowestPoint) 指的是构造函数,那么它仍然如何工作?

    传递给构造函数的参数会影响调用哪个构造函数。在compar() 的情况下,使用默认构造函数,在PointComparator(lowestPoint) 中,使用转换构造函数。它之所以有效,是因为PointComparator 有一个适当类型的转换构造函数。

    我只是对显式关键字感到困惑。

    这意味着构造函数不能用于隐式转换。它会阻止以下工作:std::sort(b, e, lowestPoint);。通常建议避免隐式转换构造函数。

    【讨论】:

      猜你喜欢
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 2013-04-28
      • 2019-11-26
      • 2013-09-28
      • 2023-03-09
      相关资源
      最近更新 更多