很简单,这段代码出了什么问题?
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
的{{1}}类型值(注意time
变量此处与时钟无关或实际时间,它只是double类型的增加对象。因此,当用户添加某个事件时,它将在某个时间被调用。
标准下的多集合容器会按某种顺序整理对象(通常,如果不是总是time
)。然后循环遍历容器,我可以在增加变量std::less<T>
的变化时调用Event
。
有什么问题?
正如KyleC指出的那样(参见他的回答),编译器无法理解double time
订购的过程
我如何克服这个问题
你每天都学到新东西。上面的代码是通过最初混合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));
}
这只是在这里写的,它可以帮助人们,虽然很明显,但仍然。
答案 0 :(得分:3)
问题是订购了multiset。
您收到的错误是:
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
multiset不知道如何处理这个问题,因为它不知道如何订购多重集。
在内部,多集合容器会对其所有元素进行排序 遵循其比较对象指定的标准。该 在此之后,元素始终插入其各自的位置 排序
使用矢量有什么问题?
- 根据您的评论,我认为地图可以很好地满足您的目的。
std::map < float, Event > event_map;
event_map.insert(std::make_pair(time, func_object));