代码之家  ›  专栏  ›  技术社区  ›  kadina

为什么在std::for_each()返回时调用转换运算符?

  •  3
  • kadina  · 技术社区  · 7 年前

    我正在学习函子及其用法。我在下面的一个堆栈溢出问题中遇到了代码。

    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    
    class CalculateAverage
    {
    private:
       std::size_t num;
       double sum;
    
    public:    
       CalculateAverage() : num (0) , sum (0)
       {
       }
    
       void operator()(int elem) 
       {
          num++;
          sum += elem;
       }
    
       operator double () const
       {
           return sum / num;
       }
    };
    
    int main()
    {
        vector<int> values;
    
        for (int i = 1; i <= 5; i++)
            values.push_back(i);
    
        int average = std::for_each(values.begin(), values.end(), CalculateAverage());
    
        cout << average << endl;
    }
    

    输出:3

    我理解函子的概念。但我不明白为什么要调用转换函数。std::for_each()返回的函数与我们作为最后一个参数传递给for_each()的函数相同。这里我们传递的是()重载函数。有人能帮助我理解为什么在这种情况下调用转换函数吗?

    1 回复  |  直到 7 年前
        1
  •  6
  •   NathanOliver    7 年前

    您没有将函数传递给 std::for_each ,则传递一个函子(充当函数的对象)。什么时候? 标准::每个 返回您传递给它的函数对象。函数对象的类型为 CalculateAverage 但你想把它分配给 int 是的。所以选择转换运算符来转换返回的 计算范围 变成一个 double 然后用来初始化 average 是的。