Aracılığıyla paylaş


C++ Standart Kitaplığındaki İşlev Nesneleri

İşlev nesnesi veya functor, operator() uygulayan herhangi bir türdür. Bu işleç çağrı işleci veya bazen uygulama işleci olarak adlandırılır. C++ Standart Kitaplığı, işlev nesnelerini öncelikle kapsayıcılar ve algoritmalar için sıralama ölçütleri olarak kullanır.

İşlev nesneleri, düz bir işlev çağrısına göre iki ana avantaj sağlar. Birincisi, bir işlev nesnesinin durum içerebileceğidir. İkincisi, işlev nesnesinin bir tür olmasıdır ve bu nedenle şablon parametresi olarak kullanılabilir.

İşlev Nesnesi Oluşturma

İşlev nesnesi oluşturmak için bir tür oluşturun ve işleç() uygulayın; örneğin:

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

int main()
{
    Functor f;
    int a = 5;
    int b = 7;
    int ans = f(a, b);
}

İşlevin main son satırında işlev nesnesini nasıl çağırdığınız gösterilir. Bu çağrı bir işlev çağrısı gibi görünür, ancak aslında Functor türünde operator() çağrısıdır. İşlev nesnesini çağırma ile işlev arasındaki bu benzerlik, işlev nesnesi teriminin nasıl ortaya çıktığıdır.

İşlev Nesneleri ve Kapsayıcıları

C++ Standart Kitaplığı, üst bilgi dosyasında birkaç işlev nesnesi <functional> içerir. Bu işlev nesnelerinin bir kullanımı, kapsayıcılar için bir sıralama ölçütüdür. Örneğin, set kapsayıcı aşağıdaki gibi bildirilir:

template <class Key,
    class Traits=less<Key>,
    class Allocator=allocator<Key>>
class set

İkinci şablon bağımsız değişkeni işlev nesnesidir less. İlk parametre ikinci parametreden küçükse bu işlev nesnesi döndürür true . Bazı kapsayıcılar öğelerini sıraladığından kapsayıcının iki öğeyi karşılaştırmak için bir yönteme ihtiyacı vardır. Karşılaştırma, işlev nesnesi kullanılarak yapılır. Bir işlev nesnesi oluşturup kapsayıcının şablon listesinde belirterek kapsayıcılar için kendi sıralama ölçütlerinizi tanımlayabilirsiniz.

İşlev Nesneleri ve Algoritmaları

İşlevsel nesnelerin başka bir kullanımı da algoritmalarda kullanılır. Örneğin, remove_if algoritma aşağıdaki gibi bildirilir:

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

için son bağımsız değişkenremove_if, boole değeri (koşul) döndüren bir işlev nesnesidir. İşlev nesnesinin sonucu ise true, öğesi yineleyiciler first ve lasttarafından erişilen kapsayıcıdan kaldırılır. Bağımsız değişken için üst bilgide <functional> bildirilen işlev nesnelerinden herhangi birini kullanabilir veya kendi nesnenizi pred oluşturabilirsiniz.

Ayrıca bkz.

C++ Standart Kitaplığı Başvurusu