Всем привет!
подскажите как можно сделать что-то подобное на это:
struct for_reciver_1 {int data;};
struct for_reciver_2 {int data; int error_code;};
template<class VALUE>
struct reciver_t
{
std::map<int, VALUE> m;
void add_data(int data)
{
m.insert(std::make_pair(data, VALUE()));
}
};
struct sender_t
{
std::map<reciver_t*, int> m;
void add_recv(reciver_t *r, int i)
{
m.insert(std::make_pair(r,i));
}
void update_recv_list()
{
// функция перевыполняясь в отдельном потоке, периодически отправляет reciver'ам данные
while (true)
for (auto &it : m)
it.first->add_data(it.second);
}
};
int main()
{
sender_t sender;
reciver_t<for_reciver_1> reciver_1;
reciver_t<for_reciver_2> reciver_2;
sender.add_recv(&reciver_1, 1);
sender.add_recv(&reciver_2, 2);
sender.update_recv_list();
}
но чтобы работало?
c++14 приветствуется.
Спасибо!
Здравствуйте, makdak, Вы писали:
M>Всем привет!
M>подскажите как можно сделать что-то подобное на это:
struct reciver
{
virtual ~reciver ( ) {}
virtual void add_data(int data) = 0;
};
template<class VALUE>
struct reciver_t : reciver {
// ...
};
Здравствуйте, makdak, Вы писали:
M>Всем привет!
M>подскажите как можно сделать что-то подобное на это:
M>...
M>[/ccode]
M>но чтобы работало?
M>c++14 приветствуется.
1. Сделать add_data виртуальной функцией, как уже посоветовали выше. Но потребуется изменение reciver_t.
2. Non-intrusive type-erasure на базе
Boost.TypeErasure, или взять
std::function<void(int)>:
template<typename VALUE>
void add_recv(reciver_t<VALUE> *r, int i)
{
std::function<void(int)> f = [=](int data) { r->add_data(data) };
// ...
Но у std::function нет операторов сравнения, поэтому ключом отображения она быть не может. В качестве ключа можно взять
void* от
reciver_t<VALUE>* (если критично, то этот вариант можно немного оптимизировать).