Здравствуйте, Юрий Жмеренецкий, Вы писали:
...
ЮЖ>Тоже самое можно сделать и в compile-time на шаблонах.
Как один из вариант использования:
enum Fn // байтФункции
{
F0,
F1,
F2,
};
enum SubFn // байтПодфункции
{
SF0,
SF1,
SF2,
};
struct common_F0_SF0 : base<F0, SF0> { static int handle() { return 1;}};
struct common_F1_SF0 : base<F1, SF0> { static int handle() { return 2;}};
struct specific1_F0_SF0 : base<F0, SF0> { static int handle() { return 10;}};
struct specific1_F2_SF2 : base<F2, SF2> { static int handle() { return 20;}};
struct specific2_F1_SF1 : base<F1, SF1> { static int handle() { return 100;}};
struct specific2_F2_SF2 : base<F2, SF2> { static int handle() { return 200;}};
namespace bm = boost::mpl;
int main()
{
// Общие обработчики
typedef bm::vector<
common_F0_SF0,
common_F1_SF0>
common;
// Специфические для каждого потока
typedef bm::vector<
specific1_F0_SF0, // можно перекрыть действие по умолчанию
specific1_F2_SF2>
specific1;
typedef bm::vector<
specific2_F1_SF1,
specific2_F2_SF2>
specific2;
typedef thread_handler<common, specific1> th1;
assert(th1::handle(F0, SF0) == 10);
assert(th1::handle(F1, SF0) == 2);
assert(th1::handle(F2, SF2) == 20);
typedef thread_handler<common, specific2> th2;
assert(th2::handle(F0, SF0) == 1);
assert(th2::handle(F1, SF1) == 100);
assert(th2::handle(F2, SF2) == 200);
}