Tipp: lambda vs. FunctionObject

  • C++

    Tipp: lambda vs. FunctionObject

    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



    C-Quellcode

    1. #include "stdafx.h"
    2. #include <iostream>
    3. #include <functional>
    4. #include <windows.h>
    5. /* -------------------------------------------------------------------------------------------------- */
    6. //Es darf von FunctionObject gesprochen werden, wenn eine Funktion als Object (eigenständige Variable)
    7. //z.B. an eine Funktion übergeben werden kann.
    8. /* -------------------------------------------------------------------------------------------------- */
    9. /*
    10. // lambda-Basis
    11. auto func = [] () { cout << "A basic lambda" ; } ;
    12. // lambda-Funktion mit 'pass per value' in der Argumentenliste
    13. auto func = [](int n) { cout << n << " "; }
    14. // lambda-Funktion mit 'pass per ref' in der Argumentenliste
    15. auto func = [](int& n) { cout << n << " "; }
    16. // lambda-Funktion mit 'Capture List' wobei 'x,y' 'pass per Copy'
    17. int x = 4, y = 6;
    18. auto func = [x, y](int n) { return x < n && n < y; }
    19. // lambda-Funktion mit expliziten Rückgabe eines int-Wertes
    20. auto func = [] () -> int { return 42; }
    21. */
    22. typedef int (F_PTR)(); //Delegate
    23. F_PTR *ff_Func; //Functionsobject-Pointer
    24. int ff(){
    25. int i=50;
    26. std::cout<<"Rueckgabewert FunctionObject\t= "<<i<<std::endl;
    27. return i;
    28. }
    29. int sum0(int const &i,int const &y){
    30. return i+y;
    31. }
    32. int sum(int const &i,F_PTR f){
    33. return i+f();
    34. }
    35. int sum(int const &i,std::function<int()> const &f){
    36. return i+f();
    37. }
    38. int _tmain(int argc, _TCHAR* argv[]){
    39. //1. Alle folgende Funktionen haben einen Rückgabewert
    40. //****************************************************
    41. int res1=sum(20,&ff); //Als Funktionsobject mit 'std::function' >> C++-Style
    42. ff_Func=(F_PTR*)ff; //Die klassische C-Style-Funktion als
    43. int res2=sum(20,ff_Func); //FunctionObject (Pointerausführung)
    44. int res3=sum(20,(F_PTR*)ff); //Abkürzte C-Style-Version von res2 (Pointerausführung)
    45. //Die lambda-Funktion wird gekapselt und als FunktionsObject an die Funktion
    46. //sum(...) übergeben.
    47. int res4=sum(20,[]()-> int { // Als lambda-Funtion mit Rückgabe
    48. int i=50; // 'std::function<int()> const &f' wird aber trotzdem benötigt
    49. std::cout<<"Rueckgabewert Lambda\t\t= "<<i<<std::endl;
    50. return i;
    51. });
    52. auto res4a=[]()-> int { // lambda-Funtion mit Rückgabe als FunctionObject 'auto res4a'
    53. int i=50; // 'std::function<int()> const &f' wird benötigt
    54. std::cout<<"Rueckgabewert Lambda\t\t= "<<i<<std::endl;
    55. return i;
    56. };
    57. int res4b=sum(20,res4a); //ohne '()' dafür als FunctionObject übergeben
    58. //2. Funktionskörper in der Argumentenliste (Kein FunctionObject dafür lambda pur)
    59. //********************************************************************************
    60. int res5=sum0(20,ff()); //Die Funktion ff() wird in die Argumentenliste der Funktion sum0()
    61. //einbezogen (kein FunktionObject wird übergeben)
    62. auto res6=[]()-> int { // Als lambda-Funtion mit Rückgabe, die nachher als Funktionskörper
    63. int i=50; // in der Argumentenliste von sum0() deklariert ist. (siehe res7)
    64. std::cout<<"Rueckgabewert Lambda\t\t= "<<i<<std::endl;
    65. return i;
    66. };
    67. int res7=sum0(20,res6()); // Ganze lambda-Funktion als Variable res6() übergeben
    68. // Gleichzeitig kann res6() aber auch als FunctionObject dienen da 'auto'
    69. // >>> 'sum(20,res6);' Funktioniert auch (siehe res4b)
    70. int res8=sum0(20,[]() -> int { // Gleich wie res6 + res7, jedoch in die Argumentenliste eingebaut.
    71. int i=50;
    72. std::cout<<"Rueckgabewert Lambda\t\t= "<<i<<std::endl;
    73. return i;
    74. }());//Man beachte hier '}()' was einem Funktionsaufruf entspricht wie z.B. res6()
    75. getchar();
    76. return 0;
    77. }


    *Aus den Tipps&Tricks verschoben, da kein C++/CLI*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()