2016-06-06 17 views
2

Ich habe den folgenden Code, der gut funktioniert. Ich versuche die Syntax zu verstehen. Die Return-Anweisung hat std::plus<double>(). Das Double hier hat den Rückgabewert-Datentyp. Die Funktionsdefinition hat jedoch den Rückgabetyp std::function<double(double, double)>, der zwei Doppelparameter angibt. Wie verhalten sich diese beiden zueinander?C++ Routine-Rückgabe-Funktion

#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; 
} 

Antwort

2

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

Die ersten double ist der Rückgabetyp der Funktion. Sie können sich daran erinnern, dass Sie sich auf der linken Seite wie in einer normalen Funktionsdefinition befinden.

Die in Klammern gesetzten double s sind die Parametertypen der Funktion, genau wie in einer normalen Funktionsdefinition; minus die Parameternamen. Es gibt 2, da die Plus-Funktion 2 double s benötigt.

Dies ist sinnvoll, wenn Sie darüber nachdenken. Die Plus-Funktion/Operator ist ein binärer Operator, dh sie benötigt 2 Parameter eines Typs und gibt einen einzelnen Wert desselben Typs zurück. Aus diesem Grund müssen Sie nur einen einzelnen Typ angeben, wenn Sie std::plus<double> schreiben; Die Parameter und der Rückgabetyp müssen vom gleichen Typ sein. Es wäre fehleranfällig und nutzlos, den Anrufer zu zwingen, denselben Typ dreimal zu spezifizieren.

4

Es gibt eine implizite Konvertierung von std::plus<double> zu std::function<double(double,double)>, weil ersteres einen Elementaufrufoperator double operator()(double, double) hat. Siehe Dokumentation für std::function constructors.

0

Wenn Ihre Frage ist, warum es nur einen double in der Template-Parameter von std::plus aber drei in std::function ist, dann ist die Antwort so:

Für std::plus, beide Parameter und die Rückgabetyp immer gleich sein müssen , also müssen Sie es nur einmal angeben.
std::function auf der anderen Seite kann jede Funktion wie Objekt mit einer beliebigen Kombination von Parametern und returntypes, so müssen Sie grundsätzlich jeden dieser Typen einzeln angeben.