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;
}