Templated Lambda Expressions in c++

avatar

In diesem Beispiel möchte ich zeigen wie man eine größtmögliche Freiheit an Kombinationsmöglichkeiten haben kann, wenn man Generics/Templates zusammen mit Lambda Expressions verwendet. Der Vorteil an Templates sind, dass man einmalig eine Schablone definiert und diese immer wieder auch für unterschiedliche Datentypen verwenden kann. Man ersetzt einen konkreten Datentyp wie int, bool, float, ... durch bspw. T was dann quasi alles an Datentypen sein kann.

Die Syntax mit Templates sieht wie folgt aus:
auto lambda = [capture]<templates>(paramlist) -> returntype {codeblock};

#include <iostream>
#include <vector>

int main() {

    /** example lambda expression with one template argument. T can be anything **/
    auto templateLambda = []<typename T>(T arg) -> void {std::cout << arg.size() << "\n";};
    std::string text = "This is an example text.";
    templateLambda(text);

    /** you can use different datatypes with the same lambda from above. You don't
        need to define another one **/
    std::vector<int> numberlist = std::vector<int>();
    numberlist.push_back(1);
    numberlist.push_back(3);
    numberlist.push_back(5);
    numberlist.push_back(7);
    templateLambda(numberlist);

    /** But there is one limitation. The above lambda works only if your object have the
     *  size() function. Otherwise it will not work **/

    /** Or you write your own pointer creator lambda expression ;) **/
    auto pointerLambda = []<typename X>(X arg) -> X* {return new X(arg);};
    int *intptr = pointerLambda(5);
    float *floatptr = pointerLambda(3.1415f);
    std::string *stringptr = pointerLambda(std::string("Text"));

    delete intptr;
    intptr = nullptr;
    delete floatptr;
    floatptr = nullptr;
    delete stringptr;
    stringptr = nullptr;

    return 0;
}

Example: Templated Lambda expressions



0
0
0.000
0 comments