Ugrás a tartalomhoz

functional

A Wikiszótárból, a nyitott szótárból

Melléknév

functional

  1. funkcionális
  2. (informatika)

functional Könyvtár C++-ban 🚀

A functional könyvtár a C++ Standard Library része, amely függvényobjektumokat, lambda kifejezéseket, és különböző függvénykezelő eszközöket biztosít. Segítségével magasabb szintű funkcionális programozási paradigmákat valósíthatunk meg C++-ban.



1. A functional Könyvtár Főbb Elemei

Elem Leírás
std::function Általános függvényobjektum
std::bind Függvények és argumentumaik előre kötése
std::mem_fn Osztálymetódusok meghívása objektumok nélkül
std::ref / std::cref Referenciák továbbítása függvényeknek
std::invoke Függvények meghívása egységes szintaxissal

A functional könyvtár az #include <functional> direktívával érhető el.



2. std::function – Függvényobjektumok

A std::function egy általános függvénytároló, amely bármilyen kompatibilis függvényre, lambda kifejezésre vagy függvényobjektumra mutathat.

Egyszerű Példa

#include <iostream>
#include <functional>

void hello() {
    std::cout << "Hello, világ!" << std::endl;
}

int main() {
    std::function<void()> f = hello; // Függvény hozzárendelése
    f(); // Meghívás
    return 0;
}

Kimenet:

Hello, világ!

Paraméteres std::function

#include <iostream>
#include <functional>

int osszeg(int a, int b) {
    return a + b;
}

int main() {
    std::function<int(int, int)> f = osszeg;
    std::cout << "Összeg: " << f(10, 20) << std::endl;
    return 0;
}

Kimenet:

Összeg: 30

Lambda függvény tárolása

std::function<int(int)> negyzet = [](int x) { return x * x; };
std::cout << negyzet(5); // 25

3. std::bind – Függvények Argumentumainak Előrekötése

A std::bind lehetővé teszi egy függvény argumentumainak részleges rögzítését.

Egyszerű példa

#include <iostream>
#include <functional>

int osszeg(int a, int b) {
    return a + b;
}

int main() {
    auto f = std::bind(osszeg, 10, std::placeholders::_1); // Az első paraméter 10 lesz
    std::cout << f(5) << std::endl; // 10 + 5
    return 0;
}

Kimenet:

15
  • A std::placeholders::_1 azt jelenti, hogy az első argumentumot megtartjuk változóként.

Osztálymetódusok használata std::bind-dal

#include <iostream>
#include <functional>

struct Szemely {
    void udvozles(const std::string& nev) {
        std::cout << "Szia, " << nev << "!" << std::endl;
    }
};

int main() {
    Szemely sz;
    auto f = std::bind(&Szemely::udvozles, &sz, "Anna");
    f(); // Szia, Anna!
    return 0;
}

4. std::mem_fn – Metódusok Meghívása Objektumok Nélkül

A std::mem_fn egy tagfüggvényt hív meg egy adott objektumon.

#include <iostream>
#include <functional>

struct Ember {
    void koszones() const {
        std::cout << "Hello!" << std::endl;
    }
};

int main() {
    Ember e;
    auto f = std::mem_fn(&Ember::koszones);
    f(e); // Meghívja e.koszones() metódust
    return 0;
}

Kimenet:

Hello!

5. std::ref és std::cref – Referenciák Továbbítása

A std::ref és std::cref biztosítja, hogy referenciaként adjuk át egy változót egy függvénynek.

Példa: Referencia használata

#include <iostream>
#include <functional>

void noveles(int& x) {
    x += 10;
}

int main() {
    int a = 5;
    std::function<void()> f = std::bind(noveles, std::ref(a)); // Referenciával kötjük meg
    f();
    std::cout << "Új érték: " << a << std::endl;
    return 0;
}

Kimenet:

Új érték: 15
  • Ha std::ref nélkül használnánk, a noveles() nem módosítaná az a változót.



6. std::invoke – Egységes Függvényhívás

A std::invoke lehetővé teszi tetszőleges függvény vagy funktor meghívását egységes módon.

Egyszerű példa

#include <iostream>
#include <functional>

int osszeg(int a, int b) {
    return a + b;
}

int main() {
    std::cout << std::invoke(osszeg, 5, 10) << std::endl; // 15
    return 0;
}

Osztálymetódusok meghívása

struct Ember {
    int kor;
    void udvozlet() {
        std::cout << "Szia!" << std::endl;
    }
};

int main() {
    Ember e{25};
    std::invoke(&Ember::udvozlet, e);
    std::cout << "Kor: " << std::invoke(&Ember::kor, e) << std::endl;
    return 0;
}

Kimenet:

Szia!
Kor: 25

Összegzés

std::function – Általános függvényobjektum, amely tárolhat lambda kifejezéseket és normál függvényeket.
std::bind – Függvények előrekötése argumentumokkal.
std::mem_fn – Osztálymetódusok hívása objektumokon.
std::ref / std::cref – Referenciák továbbítása függvényeknek.
std::invoke – Egységes függvényhívás bármilyen típusú callable objektum esetén.

A functional könyvtár segítségével hatékonyabb és rugalmasabb C++ kódokat írhatsz, különösen a modern C++11/14/17 szabványokkal kombinálva. 🚀