- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
#pragma once
#include <vector>
#include <assert.h>
class Obj
{
public:
virtual ~Obj(void) { }
};
class Sig
{
typedef void (Obj::*slot_t)(void*);
mutable std::vector<std::pair<Obj*, Sig::slot_t>> m_connSlots;
public:
void operator()(void* arg) const
{
std::vector< std::pair<Obj *, slot_t> >::const_iterator iter = m_connSlots.cbegin();
while(iter != m_connSlots.cend())
{
Obj * object = iter->first;
slot_t slot = iter->second;
(object->*slot)(arg);
iter++;
}
}
template<class obj_T> void connect(obj_T* object, void (obj_T::*slot)(void*)) const
{
assert(dynamic_cast<Obj*>(object)!=0);
m_connSlots.push_back(std::make_pair(reinterpret_cast<Obj*>(object),
reinterpret_cast<Sig::slot_t>(slot)));
}
};
написав некую шаблонную обвязку по аналогии с function, можно получить на руки все типы R результат, A1..An аргументы, и таким образом не привязываться к тому, что аргументы всегда будут одни и те же
ну или забить на шаблонную обвязку и сделать operator () темплейтовым с целью сбагривания всего переданного в function
должно получиться нечто
за деталями советую посмотреть boost::signals2, работает без всяких moc и даже в С++03
зы сорри за многочисленные правки
И, кстати, я бы рад воспользоваться boost (см. спойлер в предыдущем сообщении :) или написать всё на Qt, да только работа не разрешает пользоваться ни тем, ни другим :(
мы на работу зимой взяли пацана, которому на предыдущем месте работы не разрешали использовать даже stl, не предлагая ничего взамен (в некоторых конторах стл не используется по необходимости запуска кода даже на шреддерах, но это не его случай)
такие ублюдочные условия труда дискредитируют язык
sig1.connect(&someclass::somemethod, &smth, "text comment", _1);
т.е. bind() спрятать.