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