2

很简单,这段代码有什么问题?

    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::multisetstd::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));
}

这只是写在这里,以防它可能对人们有所帮助,尽管很明显但仍然如此。

4

1 回答 1

3

问题是多重集是有序的。

你得到的错误是:

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));
于 2013-04-02T19:46:18.920 回答