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- コマンドを使用して単純にg++ -std=c++11 main.cpp

なぜ私はこれをしたいのですか?

プログラムはリアルタイムで実行され、関数には呼び出されadd_even_handlerた型の値が含まれます(ここでの変数は、時計や実際の時間とは関係がないことに注意してください。これは double 型の増加するオブジェクトにすぎません)。したがって、ユーザーがイベントを追加すると、特定の時間に呼び出されます。doubletimetime

標準の下の multiset コンテナーは、オブジェクトをある順序で照合します (通常、常にではありませんがstd::less<T>)。次に、コンテナをループして、Eventvariable の変更が増加したときに を呼び出すことができましたdouble time

何が問題ですか?

KyleC が指摘したように (彼の回答を参照)、std::function<>コンパイラはどのプロセスを注文するかを理解していません。

私がどのように問題を克服したか

あなたは毎日何か新しいことを学びます。上記のコードは、最初に と を混ぜて問題を考えすぎた結果std::multisetですstd::tuplestd::map<T,S>orは、この場合は typeでstd::multimap<T,S>ある関連によってソートされます。これは、標準ではデフォルトで再びです。上記の代わりに、次のようなことをしましたkeydoublestd::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