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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> typeof макрос 
:(
    Опции темы
NewDima
Дата 23.1.2010, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Как заставить конструкцию &BOOST_TYPEOF(*this)::a работать?
PM ICQ   Вверх
Lazin
Дата 23.1.2010, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



зачем вам BOOST_TYPEOF?
PM MAIL Skype GTalk   Вверх
NewDima
Дата 23.1.2010, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



У меня макрос генерирует код для метода класса. Он не знает, в каком классе он будет находиться
PM ICQ   Вверх
Lazin
Дата 23.1.2010, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



я не это спрашивал, BOOST_TYPEOF(expression) - вернет тип выражения(кстати не любого), но чего вы хотите добиться вот такой конструкцией - 
Код

&Type::a

PM MAIL Skype GTalk   Вверх
NewDima
Дата 23.1.2010, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



адрес на метод класса
PM ICQ   Вверх
Lazin
Дата 23.1.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



наверное свой класс нужно зарегистрировать

Цитата(NewDima @  23.1.2010,  15:43 Найти цитируемый пост)
адрес на метод класса

неужели нельзя его получить как нибудь по проще?


PM MAIL Skype GTalk   Вверх
NewDima
Дата 23.1.2010, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Больше вариантов не приходит в голову, я конечно думаю, но пока ничего
PM ICQ   Вверх
Lazin
Дата 23.1.2010, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(NewDima @  23.1.2010,  15:15 Найти цитируемый пост)
У меня макрос генерирует код для метода класса. Он не знает, в каком классе он будет находиться 

и что это за макрос? какой метод он должен генерировать? 
PM MAIL Skype GTalk   Вверх
NewDima
Дата 23.1.2010, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



В общем есть что-то типа слот-сигнальной модели, с разницей в том, что эмитируется сигнал в одном потоке, а выполняются слоты, соединенные с ним - в других. Для этого для каждого слота делается заглушка, которая добавляет в классе со слотом задачу для потока, в контексте которого должны выполниться слоты. Макрос:
Код

#define SIGNAL_PROTO(a) void a(ObsLis::CParams *params)
#define SLOT_P(cls,a) \
    void __slot__##a(ObsLis::CParams *params) {slotActivated(CLOSURE(this, &cls::a), params);}\
    SIGNAL_PROTO(a)

так вот  определяя слот в классе мне приходится писать и имя класса, что бредово само по себ, он ведь и уже в нем находится, получается дублирование информации:
Код

class Sloter: public ObsLis::CObject {
public:
    SLOT_P(Sloter, execute) { // здесь мне не нравится, дублируется имя класса
        ...
    }
};

По сути то все уже работает, но вот эта мелоч меня раздражает
PM ICQ   Вверх
mes
Дата 23.1.2010, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Lazin @  23.1.2010,  15:03 Найти цитируемый пост)
какой метод он должен генерировать?  

что то мне подсказывает, что необходимо для подобного :

Код

#define REGISTER(fun_name) Register(&BOOST_TYPEOF(*this)::fun_name)


Добавлено @ 16:24
опоздал.. но предчувствие не обмануло  smile 


Это сообщение отредактировал(а) mes - 23.1.2010, 16:26


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(NewDima @  23.1.2010,  16:20 Найти цитируемый пост)
В общем есть что-то типа слот-сигнальной модели, с разницей в том, что эмитируется сигнал в одном потоке, а выполняются слоты, соединенные с ним - в других. Для этого для каждого слота делается заглушка, которая добавляет в классе со слотом задачу для потока, в контексте которого должны выполниться слоты.

Смущает меня владение объектом, указатель на метод которого ты передаешь другому потоку. Может случиться так, что метод будет вызван для удаленного объекта.
Я бы сделал по другому, создавал объекты в куче и управлял бы ими с помощью boost::shared_ptr, вместо CLOSURE использовал бы boost::function, а вместо this передавал бы в метод смарт поинтер - boost::shared_ptr<SomeClass>, получилось бы, что указатель на метод класса - владеет объектом (точнее владеет умный указатель, которым владеет объект - boost::function. В результате, объект жил бы до тех пор, пока не вызовется из другого потока. 

Код

class Foo : public boost::enable_shared_from_this<Foo>
{
    Foo () {}
public:
    void Bar() { std::cout << "Bar" << std::endl; }

    typedef shared_ptr<Foo> SP
    static SP create() 
    { 
       SP sp;
       sp.reset(new Foo());
       return sp;
    }

    boost::function0<void> get_slot()
    {
         return boost::bind( &Foo::Bar, shared_from_this() );
    }
};

Foo::SP sp = Foo::create();
ThreadPool.enqueue(sp->get_slot());


PM MAIL Skype GTalk   Вверх
NewDima
Дата 23.1.2010, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Цитата(Lazin @ 24.1.2010,  02:07)
Смущает меня владение объектом, указатель на метод которого ты передаешь другому потоку. Может случиться так, что метод будет вызван для удаленного объекта.

Нет, не может, я контролирую.
Цитата

В результате, объект жил бы до тех пор, пока не вызовется из другого потока.

Это не понял, зачем так?
P.S. С бустом работаю дня три от силы, потому многого не знаю, с предложенным разберусь. Но дело в том, что кода получилось не много, его работа меня полностью удовлетворяет, не удовлетворяет не много запись =)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


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

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


 




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


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

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