很简单,这段代码有什么问题?
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
简单地使用 - with 命令编译g++ -std=c++11 main.cpp
我为什么要这样做?
程序是实时运行的,add_even_handler
函数中包含一个类型double
为 called的值time
(注意time
这里的变量与时钟或实际时间无关,它只是一个 double 类型的递增对象)。因此,当用户添加一些事件时,它将在某个时间被调用。
标准下的多集容器将按某种顺序整理对象(通常,如果不总是,std::less<T>
)。然后循环遍历容器,我可以Event
在不断增加的变量变化时调用double time
。
问题是什么?
正如 KyleC 所指出的(见他的回答),std::function<>
编译器不理解在什么过程中订购
我是如何克服这个问题的
你每天学习新的东西。上面的代码是最初混合std::multiset
和std::tuple
. std::map<T,S>
orstd::multimap<T,S>
也按关联的排序key
,在这种情况下是 type 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));
}
这只是写在这里,以防它可能对人们有所帮助,尽管很明显但仍然如此。