wrong number of template arguments
От: makdak  
Дата: 15.06.15 05:36
Оценка:
Всем привет!
подскажите как можно сделать что-то подобное на это:

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 приветствуется.
Спасибо!
Отредактировано 15.06.2015 5:43 makdak . Предыдущая версия . Еще …
Отредактировано 15.06.2015 5:43 makdak . Предыдущая версия .
Отредактировано 15.06.2015 5:40 makdak . Предыдущая версия .
Re: wrong number of template arguments
От: night beast СССР  
Дата: 15.06.15 05:51
Оценка: 3 (1) +1
Здравствуйте, makdak, Вы писали:

M>Всем привет!

M>подскажите как можно сделать что-то подобное на это:

struct reciver
{
    virtual ~reciver ( ) {}
    virtual void add_data(int data) = 0;
};

template<class VALUE>
struct reciver_t : reciver {
// ...
};
Re: wrong number of template arguments
От: Evgeny.Panasyuk Россия  
Дата: 15.06.15 06:04
Оценка: 3 (1)
Здравствуйте, 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>* (если критично, то этот вариант можно немного оптимизировать).
Отредактировано 15.06.2015 6:11 Evgeny.Panasyuk . Предыдущая версия . Еще …
Отредактировано 15.06.2015 6:04 Evgeny.Panasyuk . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.