чем чреват такой ODR?
От: niXman Ниоткуда https://github.com/niXman
Дата: 26.12.13 20:50
Оценка:
привет!

есть некоторый макрос, который генерит пару классов для RMI.
каждый из классов содержит как методы использующиеся для вызова процедуры противоположного класса, так и диспетчеризацию входящих вызовов от противоположного класса.
к примеру, у нас есть процедура login(). в вызывающем классе она будет сгенерена с такой сигнатурой: 'void login(const std::string &login, const std::string &pass)', а в противоположном — с такой: 'void login(e_login e)'.
тут, первая используется для вызова удаленной процедуры логина, а вторая — для ответа на эту процедуру вызывающей стороне.
теперь, чтоб ответить на процедуру логина — нам нужен enum e_login, который, предполагается генерить в обоих классах. почему в обоих? во втором она нужна для того, чтоб можно было послать соответствующий статус в ответ, а в первом для того, чтоб знать что такое тип e_login ,и как с ним работать.

в грубом псевдокоде так:
struct request {
   void login(const std::string &login, const std::string &pass) { 
      // сериализуем - отправляем
   }

   enum class e_login: std::uint8_t {
       ok
      ,already_logged_in
      ,unknown_error
   };
   
   void invoke(const yas::intrusive_buffer &buf) {
      // десериализуем call_id и аргумент переданный в ответ

      // деспетчеризируем
      switch (call_id) {
         case <ожидаемый ID процедуры ответа на запрос login()>: {
            e_login arg0;
            // десериализуем статус ответа в arg0
            // зовем обработчик ответа и передаем ему аргументов arg0
         } break;
      }
   }
};

struct reply {
   enum class e_login: std::uint8_t {
       ok
      ,already_logged_in
      ,unknown_error
   };

   void login(e_login e) {
      // сериализуем аргумент, и отправляем
   }
};

вопрос именно в том, что енум 'e_login' будет генерится дважды, но при этом, описываться в макро-вызове один раз.

выскажитесь, чем чреват этот способ?

благодарен.

зы
логично подумать, что описание подобных енумов нужно вынести вне любого из классов, но на практике это совсем неудобно, да и не нужно, ибо используются подобные енумы в очень ограниченном участке кода, и никогда вне классов в которых они описаны, или их наследников.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: чем чреват такой ODR?
От: niXman Ниоткуда https://github.com/niXman
Дата: 26.12.13 21:00
Оценка:
разумеется я понимаю что 'request::e_login' и 'reply::e_login' — это разные типы.
но, т.к. они сгенерированны абсолютно идентичными — то и значения их будут совпадать после десериализации.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: чем чреват такой ODR?
От: uzhas Ниоткуда  
Дата: 27.12.13 06:59
Оценка:
Здравствуйте, niXman, Вы писали:

X>разумеется я понимаю

уточни в чем твой вопрос и касается ли он языка C++
Re[3]: чем чреват такой ODR?
От: niXman Ниоткуда https://github.com/niXman
Дата: 27.12.13 07:02
Оценка:
вопрос:

вопрос именно в том, что енум 'e_login' будет генерится дважды, но при этом, описываться в макро-вызове один раз.

пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: чем чреват такой ODR?
От: uzhas Ниоткуда  
Дата: 27.12.13 07:05
Оценка: 3 (1) +2
Здравствуйте, niXman, Вы писали:

X>вопрос:

X>

X>вопрос именно в том, что енум 'e_login' будет генерится дважды, но при этом, описываться в макро-вызове один раз.


будет два разных типа с совпадающими значениями. грубо говоря, копипаста будет, но с точки зрения языка проблем нет (все скомпилируется и не будет UB)
Re: чем чреват такой ODR?
От: uzhas Ниоткуда  
Дата: 27.12.13 07:42
Оценка:
Здравствуйте, niXman, Вы писали:

X>зы

X>логично подумать, что описание подобных енумов нужно вынести вне любого из классов, но на практике это совсем неудобно, да и не нужно
я "логично" думаю рекомендую переосмыслить дизайн и тогда копипаста исчезнет сама собой
Re[2]: чем чреват такой ODR?
От: niXman Ниоткуда https://github.com/niXman
Дата: 27.12.13 08:04
Оценка:
Здравствуйте, uzhas, Вы писали:

U>рекомендую переосмыслить дизайн

уже.

думаю генерить базовый класс, в который и будут генериться енумы. и этот сгенеренный базовый класс наследовать в эти два класса.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.