Полезные идиомы многопоточности С++
25 мин

Пользователь





Cтоит отметить, что вся эта затея носит исключительно некоммерческий характер и делается только из-за большой любви к материалу.
Что это? Это — любительский фан фильм, действие которого разворачивается полностью во вселенной Half-Life 2 и, более или менее, идет по сценарию оной же. Все действие будет разбито на дни (читай, серии). Соответственно, первый день — прибытие Фримена в City 17, встреча с Барни, побег от комбайнов и заканчивается знакомством с метрокоповским разрядником на чердаке одного из домов. Ну, вы помните, потом Алекс… и т.д.


В C# есть делегаты. В python есть делегаты. В javascript есть делегаты. В Java есть выполняющую их роль замыкания. А в C++ делегатов нет O_O. Многие талантливые программисты успешно борются с этим недостатком, разрабатывая и используя sigslots, boost::function и другие ценные и нужные библиотеки. К сожалению, большинство реализаций отличаются не только методом использования, но также эпической сложностью применяемой шаблонной магии. Дабы при изучении исходников boost::function волосы не вставали дыбом, я написал эту небольшую статью, показывающую как самым простым и топорным способом реализовать делегат на C++. Описанная реализация является иллюстративной, имеет множество недостатков и ее вряд ли можно применить в серьезных проектах — зато она максимально простая и позволяет ознакомиться с предметной областью не разбирая трехэтажные шаблоны sigslots :).

std::string month;
std::string days;
std::cout << "Enter month name: ";
std::cin >> month;
SWITCH (month)
{
CASE("february"):
days = "28 or 29";
break;
CASE("april"):
CASE("june"):
CASE("september"):
CASE("november"):
days = "30";
break;
CASE("january"):
CASE("march"):
CASE("may"):
CASE("july"):
CASE("august"):
CASE("october"):
CASE("december"):
days = "31";
break;
DEFAULT:
days = "?";
break;
}
std::cout << month << " has " << days << " days." << std::endl;
