Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> удаленный вызов. детали, реализация, архитектура, у темы новое название! 
:(
    Опции темы
boostcoder
Дата 5.11.2010, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  5.11.2010,  01:05 Найти цитируемый пост)
struct stc::user_list_t
{  
     std::vector<>  users;
};

это генериться.

Цитата(mes @  5.11.2010,  01:05 Найти цитируемый пост)
rpc_packet user_list (std::vector<std::string> const&)
{        
}  

а это не понял где должно быть.
PM WWW   Вверх
mes
Дата 5.11.2010, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  5.11.2010,  00:10 Найти цитируемый пост)
а это не понял где должно быть. 

тоже генериться, как альтернатива структуры.. без промежуточного состояния.. 


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 5.11.2010, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



изменил предыдущий код так:
Код

#include <iostream>
#include <boost/signals2.hpp>
#include <type_traits>
#include <boost/typeof/typeof.hpp>

template<typename>
struct real_call;

/***************************************************************************/

struct type1 {
   enum { meta_id = 0 };
};

struct type2 {
   enum { meta_id = 1 };
};

struct type3 {
   enum { meta_id = 2 };
   int code;
   std::string msg;
   const char* ptr;
   static_assert(!std::is_pointer<BOOST_TYPEOF(ptr)>::value, "pointers not allowed");
};

/***************************************************************************/

template<>
struct real_call<type1> {
   typedef boost::signals2::signal<void(const type1&)> handler_t;
   
   real_call()
   {}

   void call(const void* ptr) {
      if ( !boost::is_same<handler_t::slot_type::result_type, void>::type::value ) {
         std::cout << "call<type1> return" << std::endl;
      } else {
         std::cout << "call<type1> no return" << std::endl;
      }
   }
};

template<>
struct real_call<type2> {
   typedef boost::signals2::signal<int(const type2&)> handler_t;
   
   real_call()
   {}

   void call(const void* ptr) {
      if ( !boost::is_same<handler_t::slot_type::result_type, void>::type::value ) {
         std::cout << "call<type2> return" << std::endl;
      } else {
         std::cout << "call<type2> no return" << std::endl;
      }
   }
};

template<>
struct real_call<type3> {
   typedef boost::signals2::signal<std::string(const int&, const std::string&)> handler_t;
   
   real_call()
   {}

   void call(const void* ptr) {
      if ( !boost::is_same<handler_t::slot_type::result_type, void>::type::value ) {
         std::cout << "call<type3> return" << std::endl;
      } else {
         std::cout << "call<type3> no return" << std::endl;
      }
   }
};

/***************************************************************************/

template<typename T>
void call() {
   real_call<T> o;
   o.call(0);
}

/***************************************************************************/

int main() {
   const char* ptr;
   std::cout << boost::is_pointer<BOOST_TYPEOF(ptr)>::value << std::endl;

   call<type1>();
   call<type2>();
   call<type3>();
}

/***************************************************************************/


по поводу нелепых if`ов известных на стадии компиляции:
Код

   void call(const void* ptr) {
      if ( !boost::is_same<handler_t::slot_type::result_type, void>::type::value ) {
         std::cout << "call<type1> return" << std::endl;
      } else {
         std::cout << "call<type1> no return" << std::endl;
      }
   }

препроцессором невозможно определить возвращаемый тип. потому придется генерить такое. с другой стороны, разумный компилятор при оптимизации должен вырезать невалидный блок.

Добавлено через 1 минуту и 10 секунд
Цитата(mes @  5.11.2010,  01:12 Найти цитируемый пост)
тоже генериться, как альтернатива структуры.. без промежуточного состояния..  

ну сгенерится это. где и как его использовать?
PM WWW   Вверх
mes
Дата 5.11.2010, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  5.11.2010,  00:16 Найти цитируемый пост)
по поводу нелепых if`ов известных на стадии компиляции:

вполне нормально смотрятся.. и да это проблема оптимизатора.. 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 5.11.2010, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



а вообще, сейчас это преждевременно. оставим на потом.
давайте поговорим про создание классов-обработчиков по запросу сторон smile 
PM WWW   Вверх
mes
Дата 5.11.2010, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  5.11.2010,  00:19 Найти цитируемый пост)
а вообще, сейчас это преждевременно. оставим на потом.

 smile согласен smile

Цитата(boostcoder @  5.11.2010,  00:19 Найти цитируемый пост)
давайте поговорим про создание классов-обработчиков по запросу сторон 

давайте.. только вначале хотелось бы услышать, для чего такое может пригодиться.. и чем не подходит набор статических обработчиков... 




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 5.11.2010, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  5.11.2010,  01:31 Найти цитируемый пост)
только вначале хотелось бы услышать, для чего такое может пригодиться.. и чем не подходит набор статических обработчиков... 

во первых - некоторый класс, при создании, может требовать некоторые значения в конструктор, которых просто нет, т.к. юзер только подключился.
во вторых - это ограничение.
PM WWW   Вверх
mes
Дата 5.11.2010, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  5.11.2010,  00:45 Найти цитируемый пост)
во первых - некоторый класс, при создании, может требовать некоторые значения в конструктор, которых просто нет, т.к. юзер только подключился.
во вторых - это ограничение. 


по-моему мы о разном говорим.. не могли бы привести псевдокод показывающий создание и целевое использовние контролера, так как вы это представляете ?



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 5.11.2010, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



добрый день Вам.


Цитата(mes @  5.11.2010,  10:04 Найти цитируемый пост)
создание и целевое использовние контролера

Вы говорите о контроллерах, а я об обработчиках.


PM WWW   Вверх
mes
Дата 5.11.2010, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  5.11.2010,  12:15 Найти цитируемый пост)
Вы говорите о контроллерах, а я об обработчиках.

а о каких ?  smile

Добавлено @ 13:30
а насчет компромиса между структорой  и функцией.. 
можно наверно использовать cow-враппер для массивных объектов..
 по использованию будет наверно так :

Код

  cow<std::vector<std::string> > _userlist;
  send (stc::userlist (_userlist));


тогда функции излишни, так как не будет беспокойств о лишних массивных копированиях..

      


Это сообщение отредактировал(а) mes - 5.11.2010, 13:32


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 5.11.2010, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  5.11.2010,  13:20 Найти цитируемый пост)
а о каких ?

ну как это, о каких.. о тех классах, методы которых будут вызываться по запросу второй стороны.

Добавлено через 5 минут и 32 секунды
Цитата(mes @  5.11.2010,  13:20 Найти цитируемый пост)
а насчет компромиса между структорой  и функцией.. 
можно наверно использовать cow-враппер для массивных объектов..

тогда врапер будет использоваться совместно с генерируемой структурой? но структуры разные. или что?

я это реализовал так:
Код

#include <iostream>
#include <string>
#include <vector>
#include <type_traits>
#include <boost/mpl/if.hpp>
#include <boost/type_traits.hpp>

/***************************************************************************/

template<typename T>
struct remove_ext {
   static_assert(!boost::is_pointer<T>::value, "in method arguments pointers is not allowed!");
   typedef typename
   boost::mpl::if_<
      boost::is_reference<T>,
      typename boost::remove_reference<T>::type,
      T
   >::type deref;
   typedef typename
   boost::mpl::if_<
      boost::is_const<deref>,
      typename boost::remove_const<deref>::type,
      deref
   >::type type;
};

/***************************************************************************/

struct type {
   enum { meta_id = 0 };

   remove_ext<const std::string&>::type msg; // std::string
   remove_ext<int>::type code; // int
   remove_ext<const std::vector<std::string>&>::type users; // std::vector<std::string>

   template<typename archive_type>
   void serialize(archive_type& ar, const unsigned int) {
      ar & msg
         & code
         & users;
   }
};

/***************************************************************************/

int main() {
   static_assert(boost::is_same<char, remove_ext<char&>::type>::value, "char& test fail");
   static_assert(boost::is_same<char, remove_ext<char const&>::type>::value, "char const& test fail");
   static_assert(boost::is_same<char, remove_ext<const char&>::type>::value, "const char& test fail");

   static_assert(boost::is_same<int, remove_ext<int&>::type>::value, "int& test fail");
   static_assert(boost::is_same<int, remove_ext<int const&>::type>::value, "int const& test fail");
   static_assert(boost::is_same<int, remove_ext<const int&>::type>::value, "const int& test fail");

   static_assert(boost::is_same<long, remove_ext<long&>::type>::value, "long& test fail");
   static_assert(boost::is_same<long, remove_ext<long const&>::type>::value, "long const& test fail");
   static_assert(boost::is_same<long, remove_ext<const long&>::type>::value, "const long& test fail");

   static_assert(boost::is_same<std::string, remove_ext<std::string&>::type>::value, "std::string& test fail");
   static_assert(boost::is_same<std::string, remove_ext<std::string const&>::type>::value, "std::string const& test fail");
   static_assert(boost::is_same<std::string, remove_ext<const std::string&>::type>::value, "const std::string& test fail");
}


PM WWW   Вверх
mes
Дата 5.11.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  5.11.2010,  12:36 Найти цитируемый пост)
ну как это, о каких.. о тех классах, методы которых будут вызываться по запросу второй стороны.

a контроллеры тогда кто ?



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 5.11.2010, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  5.11.2010,  14:38 Найти цитируемый пост)
a контроллеры тогда кто ?

наверное это интерфейсы предоставляющие возможность вызова методов класса обработчика на противоположной стороне?

Добавлено через 13 минут и 46 секунд
в общем, есть классы client и server.
к примеру со стороны клиентского кода, вызов методов сервера должен выглядеть так:
Код

client.server_method(...);

со стороны сервера так:
Код

server.client_method(...);


что для этого нужно?
PM WWW   Вверх
mes
Дата 5.11.2010, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



ладно.. вот для обработчиков псевдо код :

Код

connection_handler  _conn ( .. );
auth_handler        _auth ( .. );
ping_handler        _ping ( .. );
game_handler        _game ( .. );

rpc_tcpclient _client;
rpc_connect  (_client, _conn);
rpc_connect  (_client, _auth);
rpc_connect  (_client, _ping);
rpc_connect  (_client, _gamе);


такой пойдет ?



Это сообщение отредактировал(а) mes - 5.11.2010, 15:05


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 5.11.2010, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  5.11.2010,  15:02 Найти цитируемый пост)
такой пойдет ?

не очень..

ладно... как это вижу я..
для каждого класса обработчика нужно генерировать еще и интерфейс(контроллер?) который используется на противоположной стороне.
Код

iface_ptr<game> game_ptr = client.get<game>();
game->method(...);


вот smile

Добавлено @ 15:08
Цитата(boostcoder @  5.11.2010,  15:07 Найти цитируемый пост)
client.get<game>();

т.е. таким образом мы получим интерфейс к классу game обработчики которого лежат на сервере.

Up.


Это сообщение отредактировал(а) boostcoder - 5.11.2010, 15:10
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0994 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.