2016-06-06 4 views
2

У меня есть следующий код, который отлично работает. Я пытаюсь понять синтаксис. Оператор возврата имеет std::plus<double>(). Здесь у двойника есть тип данных возвращаемого значения. Но определение функции имеет возвращаемый тип как std::function<double(double, double)>, который указывает два двойных параметра. Как эти два относятся друг к другу?Функция возврата в C++

#include <functional> 
#include <iostream> 

using namespace std; 

std::function<double(double, double)> GetFunction() 
{ 
    return std::plus<double>(); 
} 

int main() 
{ 
    auto operation = GetFunction(); 

    int a = operation(1, 4); 

    std::cout << std::plus<>{}(1, 4) << '\n'; 

    return 0; 
} 

ответ

2

В std::function<double(double, double)>:

Первый double является тип возврата функции. Вы можете помнить, что, понимая, что это слева, точно так же, как в обычном определении функции.

В круглых скобках указаны типы параметров функции, как и при определении нормальной функции; минус имена параметров. Есть 2, поскольку функция плюса принимает 2 double s.

Это имеет смысл, если вы думаете об этом. Функция plus/operator - это двоичный оператор, то есть он принимает 2 параметра типа и возвращает одно значение одного и того же типа. Вот почему вам нужно указывать только один тип, когда вы пишете std::plus<double>; параметры и тип возврата должны быть одного типа. Было бы опрометчиво и бесполезно, чтобы вызывающий вызывал один и тот же тип 3 раза.

4

Существует неявное преобразование от std::plus<double> до std::function<double(double,double)>, поскольку у бывшего оператора-оператора-участника double operator()(double, double). См. Документацию для std::function constructors.

0

Если ваш вопрос, почему существует только один double в параметре шаблона из std::plus, но три в std::function, то ответ таков:

Для std::plus, оба параметра и ReturnType всегда должны быть одинаковыми , поэтому вам нужно только указать его один раз.
std::function, с другой стороны, может содержать любую функцию, такую ​​как объект, с любой комбинацией параметров и возвращаемых типов, поэтому вы должны в основном указывать каждый из этих типов по отдельности.

Смежные вопросы