Проще говоря, что не так с этим фрагментом кода?
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));
}
Это просто написано здесь на случай, если это может помочь людям, хотя и очевидно, но тем не менее.
Проблема в том, что мультисеть упорядочена.
Ошибка, которую вы получаете:
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));
Других решений пока нет …