чем чреват такой 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 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.