Как перегруженный тип данных вызывается из функтора

Звоните функтору:

   double average=std::for_each(values.begin(),values.end(),CalculateAverage());

Выше кода вызовет функтор CalculateAverage,

но изнутри "void operator () (double elem)", где вызывается "operator double() const".

Функтор определяется так:

class CalculateAverage
{
private:
   std::size_t num;
   double sum;
public:

   CalculateAverage() : num (0) , sum (0)
   {
   }

   void operator () (double elem) 
   {
      num++; 
      sum += elem;
   }

   operator double() const
   {
       return sum / num;
   }
};

2 ответа

Решение

Как и где вызывается double() const?

std::for_each возвращает объект функции.

Обычно это делается так:

CalculateAverage average=std::for_each(values.begin(),values.end(),CalculateAverage());

Но в вашем случае average превращается в double из-за перегрузки, присутствующей в вашем классе.

Вы указали оператор преобразования, благодаря которому он вызывается.

Как и где вызывается double() const?

перегрузка std::for_each вы используете функтор возврата, который вы передали в качестве третьего параметра. Когда он возвращается, компилятор применяет пользовательское преобразование. В вашем случае это неявно, поэтому нет необходимости в приведении.

Вы можете сделать это явным, тогда вам придется привести результат к удвоению:

explicit operator double() const

а также:

double average=static_cast<double>(std::for_each(values.begin(),values.end(),CalculateAverage()));
Другие вопросы по тегам