Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2013, 01:58   #11
asmprog
Пользователь
 
Регистрация: 10.08.2013
Сообщений: 67
По умолчанию

1. я предложил как пример, причем сам сказал, что не нужно так извращаться
2. это команды ассемблера(кроме jmpz, jmpz - это опкод VM PHP, топикстартер, видимо, так jnz/jz обозначил).
asmprog вне форума Ответить с цитированием
Старый 25.08.2013, 14:09   #12
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от hak3dPunk Посмотреть сообщение
Всем ПРОграммистам привет!
Я долго искал в интернете, может плохо, может не так задавал вопрос, но увы, ответа не нашел.
Вопрос в следующем, сервер принимает пакеты и обрабатывает их, но IFать и SWITCHать 30-40 с немалым пакетов, мягко говоря, не удобно. Какой может быть выход? Приминение паттерна "стратегия" не нашел, т.е. как были ифы/свитчи так и остались, просто обработка пакетов усложнилась и отдалилась.
Какие есть варианты?
Можно приспособить такое решение:

"я хочу иметь возможность создавать объекты, указывая символьное имя класса этих объектов"

http://ideone.com/uRIveT

Код:
#include<map>
#include<string>
#include<iostream>
using namespace std;
 
struct IFoo{};

struct Factory
{
  struct Base{ virtual IFoo * build()const=0;  };
  
  typedef std::string Str;
  typedef std::map<const Str, Base*> Map;
  typedef Map::const_iterator It;
  typedef Map::value_type ValType;
 
  template<class T> struct Builder : Base
  { 
    IFoo* build()const { return new T; };  
  };
 
  template<class T> static void reg_class(const Str& key)
  {
      reg().insert( ValType(key, new Builder<T>())  );  
  }
 
  static IFoo* build(const Str& key) 
  {
      It it = reg().find(key);
      return (it==reg().end())? 0l : it->second->build() ;
  }
private:
  static std::map<const Str, Base*>& reg(){ static Map data; return data; }

};

struct Bar0 : IFoo
{
    Bar0(){ cout<<"i am Bar0\n"; }
};
struct Bar1 : IFoo
{
    Bar1(){ cout<<"i am Bar1\n"; }
};

int main()
{
    Factory::reg_class<Bar0>("Bar0");
    Factory::reg_class<Bar1>("Bar1");
    
    //---------

    IFoo* ptr = Factory::build("Bar0");
}
Если немножко подшлифовать это решение - можно будет приспособить для пакетов: сериализуемые объекты тупо сохраняют имена своих классов, ну или вместо имени можно использовать числовой идентификатор.

Единственное - все равно придется ручками регистрировать классы.
_Bers вне форума Ответить с цитированием
Старый 25.08.2013, 21:56   #13
hak3dPunk
 
Регистрация: 17.11.2010
Сообщений: 4
По умолчанию

asmprog, промахнулся - jnz
_Bers, спасибо за интересное решение, будем думать!
Всем спасибо!
hak3dPunk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ветвления AK55 Паскаль, Turbo Pascal, PascalABC.NET 4 06.05.2013 19:03
скрипт и веселые тест кейсы Dimsssss SQL, базы данных 1 04.02.2013 23:00
Ветвления Евгений2508 Помощь студентам 0 15.10.2012 12:22
Ветвления Евгений2508 Помощь студентам 0 14.10.2012 09:54
Ветвления Евгений2508 Помощь студентам 1 14.10.2012 09:50