Hallo Community
Hier mal ganz einfach die Gegenüberstellung von lambda und FunctionObject für das C++.
Wie es genau in der CLI-Version aussieht weiss ich leider nicht.
Ich hoffe es hilft.
Compiler: MSVC 2010
Freundliche Grüsse
exc-jdbi
*Aus den Tipps&Tricks verschoben, da kein C++/CLI*
Hier mal ganz einfach die Gegenüberstellung von lambda und FunctionObject für das C++.
Wie es genau in der CLI-Version aussieht weiss ich leider nicht.
Ich hoffe es hilft.
Compiler: MSVC 2010
Freundliche Grüsse
exc-jdbi
C-Quellcode
- #include "stdafx.h"
- #include <iostream>
- #include <functional>
- #include <windows.h>
- /* -------------------------------------------------------------------------------------------------- */
- //Es darf von FunctionObject gesprochen werden, wenn eine Funktion als Object (eigenständige Variable)
- //z.B. an eine Funktion übergeben werden kann.
- /* -------------------------------------------------------------------------------------------------- */
- /*
- // lambda-Basis
- auto func = [] () { cout << "A basic lambda" ; } ;
- // lambda-Funktion mit 'pass per value' in der Argumentenliste
- auto func = [](int n) { cout << n << " "; }
- // lambda-Funktion mit 'pass per ref' in der Argumentenliste
- auto func = [](int& n) { cout << n << " "; }
- // lambda-Funktion mit 'Capture List' wobei 'x,y' 'pass per Copy'
- int x = 4, y = 6;
- auto func = [x, y](int n) { return x < n && n < y; }
- // lambda-Funktion mit expliziten Rückgabe eines int-Wertes
- auto func = [] () -> int { return 42; }
- */
- typedef int (F_PTR)(); //Delegate
- F_PTR *ff_Func; //Functionsobject-Pointer
- int ff(){
- int i=50;
- std::cout<<"Rueckgabewert FunctionObject\t= "<<i<<std::endl;
- return i;
- }
- int sum0(int const &i,int const &y){
- return i+y;
- }
- int sum(int const &i,F_PTR f){
- return i+f();
- }
- int sum(int const &i,std::function<int()> const &f){
- return i+f();
- }
- int _tmain(int argc, _TCHAR* argv[]){
- //1. Alle folgende Funktionen haben einen Rückgabewert
- //****************************************************
- int res1=sum(20,&ff); //Als Funktionsobject mit 'std::function' >> C++-Style
- ff_Func=(F_PTR*)ff; //Die klassische C-Style-Funktion als
- int res2=sum(20,ff_Func); //FunctionObject (Pointerausführung)
- int res3=sum(20,(F_PTR*)ff); //Abkürzte C-Style-Version von res2 (Pointerausführung)
- //Die lambda-Funktion wird gekapselt und als FunktionsObject an die Funktion
- //sum(...) übergeben.
- int res4=sum(20,[]()-> int { // Als lambda-Funtion mit Rückgabe
- int i=50; // 'std::function<int()> const &f' wird aber trotzdem benötigt
- std::cout<<"Rueckgabewert Lambda\t\t= "<<i<<std::endl;
- return i;
- });
- auto res4a=[]()-> int { // lambda-Funtion mit Rückgabe als FunctionObject 'auto res4a'
- int i=50; // 'std::function<int()> const &f' wird benötigt
- std::cout<<"Rueckgabewert Lambda\t\t= "<<i<<std::endl;
- return i;
- };
- int res4b=sum(20,res4a); //ohne '()' dafür als FunctionObject übergeben
- //2. Funktionskörper in der Argumentenliste (Kein FunctionObject dafür lambda pur)
- //********************************************************************************
- int res5=sum0(20,ff()); //Die Funktion ff() wird in die Argumentenliste der Funktion sum0()
- //einbezogen (kein FunktionObject wird übergeben)
- auto res6=[]()-> int { // Als lambda-Funtion mit Rückgabe, die nachher als Funktionskörper
- int i=50; // in der Argumentenliste von sum0() deklariert ist. (siehe res7)
- std::cout<<"Rueckgabewert Lambda\t\t= "<<i<<std::endl;
- return i;
- };
- int res7=sum0(20,res6()); // Ganze lambda-Funktion als Variable res6() übergeben
- // Gleichzeitig kann res6() aber auch als FunctionObject dienen da 'auto'
- // >>> 'sum(20,res6);' Funktioniert auch (siehe res4b)
- int res8=sum0(20,[]() -> int { // Gleich wie res6 + res7, jedoch in die Argumentenliste eingebaut.
- int i=50;
- std::cout<<"Rueckgabewert Lambda\t\t= "<<i<<std::endl;
- return i;
- }());//Man beachte hier '}()' was einem Funktionsaufruf entspricht wie z.B. res6()
- getchar();
- return 0;
- }
*Aus den Tipps&Tricks verschoben, da kein C++/CLI*
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()