C++: вставить кортеж в мультимножество с помощью std::function и сохранить порядок

Проще говоря, что не так с этим фрагментом кода?

    typedef std::function<double()>                             Event;
    typedef std::tuple <double, std::function<double()>>        Event_handle;

    std::multiset < Event_handle > event_multiset;
    std::vector < Event_handle > event_vector;
    void add_event_handler(double time, Event func_object)
    {
        // multiset version gives an error 
        // event_multiset.insert (std::make_tuple(time, func_object));
        // vector is ok
        event_vector.push_back(std::make_tuple(time, func_object));
    }

составлено с использованием g++ 4.7.2 - с командой просто g++ -std=c++11 main.cpp

Почему я хочу это сделать?

Программа запускается в режиме реального времени и add_even_handler функция включает в себя значение типа double называется time (Обратите внимание, что time переменная здесь не имеет ничего общего с часами или фактическим временем, это просто растущий объект типа double). Поэтому, когда пользователь добавляет какое-либо событие, оно будет вызвано в определенное время.

Многосетевой контейнер в соответствии со стандартом будет сопоставлять объекты в некотором порядке (обычно, если не всегда, std::less<T>). Затем перебирая контейнер, я могу вызвать Event при увеличении изменений переменной double time,

В чем проблема?

Как указывал KyleC (см. Его ответ), std::function<> компилятором не понятно в каком процессе заказывать

Как я преодолел проблему

Ты узнаешь что-то новое каждый день. Приведенный выше код был результатом переосмысления проблемы путем первоначального смешивания std::multiset а также std::tuple, std::map<T,S> или же std::multimap<T,S> также сортируется по key который в этом случае имеет тип doubleкоторый по умолчанию по умолчанию снова std::less<T>, Таким образом, вместо вышеупомянутого, я сделал что-то похожее на следующее

std::multimap <double, event> event_map;
void add_event_handler(double time, Event func_object)
{
    // multimap is ok
    event_map.insert(std::make_pair(time,func_object));
}

Это просто написано здесь на случай, если это может помочь людям, хотя и очевидно, но тем не менее.

1 ответ

Решение

Проблема в том, что мультисеть упорядочена.

Ошибка, которую вы получаете:

Error   1   error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const std::function<_Fty>' (or there is no acceptable conversion)  
error C2088: '<' : illegal for class    C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\tuple    52

Мультимножество не знает, как с этим справиться, потому что не знает, как заказать мультимножество.

Внутри многосетевые контейнеры сохраняют все свои элементы отсортированными по критерию, указанному его объектом сравнения. Элементы всегда вставляются в соответствующую позицию в соответствии с этим порядком.

Что не так с использованием вектора?

- На основании ваших комментариев, я думаю, карта будет соответствовать вашим целям.

std::map < float, Event > event_map;
event_map.insert(std::make_pair(time, func_object));
Другие вопросы по тегам