- 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)));
}
};
lohpider 30.05.2012 21:13 # −11
lohpider 30.05.2012 21:13 # −11
lohpider 30.05.2012 21:13 # −11
lohpider 30.05.2012 21:13 # −11
lohpider 30.05.2012 21:13 # −11
defecate-plusplus 30.05.2012 21:33 # 0
Xom94ok 30.05.2012 21:57 # 0
defecate-plusplus 30.05.2012 22:24 # +11
написав некую шаблонную обвязку по аналогии с function, можно получить на руки все типы R результат, A1..An аргументы, и таким образом не привязываться к тому, что аргументы всегда будут одни и те же
ну или забить на шаблонную обвязку и сделать operator () темплейтовым с целью сбагривания всего переданного в function
должно получиться нечто
за деталями советую посмотреть boost::signals2, работает без всяких moc и даже в С++03
зы сорри за многочисленные правки
Xom94ok 31.05.2012 05:32 # +1
И, кстати, я бы рад воспользоваться boost (см. спойлер в предыдущем сообщении :) или написать всё на Qt, да только работа не разрешает пользоваться ни тем, ни другим :(
defecate-plusplus 31.05.2012 07:03 # +6
мы на работу зимой взяли пацана, которому на предыдущем месте работы не разрешали использовать даже stl, не предлагая ничего взамен (в некоторых конторах стл не используется по необходимости запуска кода даже на шреддерах, но это не его случай)
такие ублюдочные условия труда дискредитируют язык
niXman 11.06.2012 15:13 # +1
sig1.connect(&someclass::somemethod, &smth, "text comment", _1);
т.е. bind() спрятать.