std::mem_fun

Teil 4 von 5 der Serie STL Rezepte Sammlung

Fun with member function pointers to non static member functions.

Die Syntax für member-Funktionen war früher ein richtiger Graus. Hier ein paar Ausschnitte aus meinem Produktivcode:

typedef void (CTest::*MemberPF)(double);
typedef std::map<std::string, MemberPF>	MemberFPMap;
MemberFPMap m_mapFP;

m_mapFP["kaufe honig"] = money2honey;
MemberFPMap::iterator it = m_mapFP.find("kaufe honig");
((*this).*((*it).second))(value);

Damit ist es zum Glück vorbei. Mit std::mem_fun kommt Freude auf.

#include <thread>
#include <mutex>
#include <string.h>

class AutoBlocker
{
private:
    std::mutex& cs;

public:
    AutoBlocker(std::mutex& _cs)
    :cs(_cs)
    {
       cs.lock();
    }

    ~AutoBlocker()
    {
        cs.unlock();
    }
};

class Service
{
private:
    std::mutex cs;
    int i;
    char buffer[10];

public:
    Service()
    :cs(), i(0)
    {
        memset(buffer, 0, sizeof(buffer));
    }

    void write(int id)
    {
        AutoBlocker ab(cs);
        buffer[i++] = id+48;
    }

    void dump()
    {
        for(i = 0; buffer[i] != 0 && i < sizeof(buffer); i++)
        {
            printf("%c", buffer[i]);
        }
    }
};

int main ()
{
    Service service;
    std::thread threads[10];
    for (int i = 0; i < 10; i++)
    {
        threads[i] = std::thread( std::bind1st(std::mem_fun(&Service::write), &service), i);
    }

    for (auto& th : threads) th.join();

    service.dump();
    return 0;
}

Series Navigation<< std::mutexstd::chrono::high_resolution_clock >>