Re[4]: Разное поведение в switch при разных контекстах выпол
От: Юрий Жмеренецкий ICQ 380412032
Дата: 11.01.09 16:09
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:
...
ЮЖ>Тоже самое можно сделать и в 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);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.