Függvényobjektumok a C++ standard kódtárban

A függvényobjektumok vagy funktorok bármilyen típusúak, amelyek implementálják.operator() Ezt az operátort híváskezelőnek vagy néha alkalmazás-operátornak is nevezik. A C++ standard kódtár elsősorban a tárolók és algoritmusok rendezési feltételeiként használja a függvényobjektumokat.

A függvényobjektumok két fő előnyt biztosítanak a normál függvényhívásokkal szemben. Az első az, hogy egy függvényobjektum tartalmazhat állapotot. A második az, hogy egy függvényobjektum egy típus, ezért sablonparaméterként használható.

Függvényobjektum létrehozása

Függvényobjektum létrehozásához hozzon létre egy típust, és implementáljon operator()például:

class LessThanFunctor
{
public:
    bool operator()(int a, int b)
    {
        return a < b;
    }
};

int main()
{
    LessThanFunctor less_than;
    int a = 5;
    int b = 7;
    bool ans = less_than(a, b);
}

A függvény utolsó sora bemutatja, main hogyan hívja meg a függvényobjektumot. Ez a hívás úgy néz ki, mint egy függvény hívása, de valójában a LessThanFunctor típus hívásaoperator(). Ez a hasonlóság a függvényobjektum és a függvény meghívása között a függvényobjektum kifejezéshez hasonló.

Függvényobjektumok és tárolók

A C++ Standard kódtár több függvényobjektumot tartalmaz a <functional> fejlécfájlban. Ezek a függvényobjektumok a tárolók rendezési feltételeként használhatók. A tároló például a set következőképpen van deklarálva:

template <class Key,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<Key>>
class set;

A második sablonargumentum a függvényobjektum less. Ez a függvényobjektum akkor ad true vissza, ha az első paraméter kisebb, mint a második paraméter. Mivel egyes tárolók rendezik az elemeket, a tárolónak két elem összehasonlítására van szüksége. Az összehasonlítás a függvényobjektum használatával történik. A tárolókra vonatkozó saját rendezési feltételeket úgy határozhatja meg, hogy létrehoz egy függvényobjektumot, és megadja azt a tároló sablonlistájában.

Függvényobjektumok és algoritmusok

A függvényobjektumok másik használata az algoritmusokban van. Az algoritmus például a remove_if következőképpen van deklarálva:

template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if(
    ForwardIterator first,
    ForwardIterator last,
    UnaryPredicate pred);

Az utolsó argumentum remove_if egy függvényobjektum, amely logikai értéket ( predikátumot) ad vissza. Ha a függvényobjektum eredménye, trueakkor az elem eltolása úgy történik, hogy az meghaladja a függvény által remove_ifvisszaadott új végeket. Az argumentum pred fejlécében <functional> deklarált függvényobjektumok bármelyikét használhatja, vagy létrehozhatja a sajátját.

Lásd még

Standard C++ kódtár-referenciák