簡単に言うと、このコードの何が問題なのですか?
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 型の増加するオブジェクトにすぎません)。したがって、ユーザーがイベントを追加すると、特定の時間に呼び出されます。double
time
time
標準の下の multiset コンテナーは、オブジェクトをある順序で照合します (通常、常にではありませんがstd::less<T>
)。次に、コンテナをループして、Event
variable の変更が増加したときに を呼び出すことができましたdouble time
。
何が問題ですか?
KyleC が指摘したように (彼の回答を参照)、std::function<>
コンパイラはどのプロセスを注文するかを理解していません。
私がどのように問題を克服したか
あなたは毎日何か新しいことを学びます。上記のコードは、最初に と を混ぜて問題を考えすぎた結果std::multiset
ですstd::tuple
。std::map<T,S>
orは、この場合は typeで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));
}
これは、明らかではありますが、人々を助ける可能性がある場合に備えて、ここに書かれています.