1

私はstd::dequeを使用してコールバック機能を維持しています。関数ポインタをstd :: dequeからvalで削除するには?

すべては、特定のコールバックを削除する以外は完全に機能します。

typedef std::function<void(void)> cb_Action; 
std::deque<cb_Action> actionCallbacks; 

私はアイテムを1つずつ追加するか、問題なくすべて削除することができます。

しかし、deque変数から特定のコールバックを削除することはできません。

actionCallbacks.erase (std::remove(actionCallbacks.begin(), actionCallbacks.end(), callbackToRemove), actionCallbacks.end()); 

それは時間のエラーをコンパイルできます:

だから、
binary '==': no operator found which takes a left-hand operand of type:'std::function<void(void)>' (or there is no acceptable conversion) 

、どのように私は、特定のcb_Actionを削除することができますか?

+1

これは、std :: functionを互いに比較できないためです。 ==と!=演算子の唯一のオーバーロードは、nullptrと比較されるものです。 –

+0

私はあなたがコールバックとそのハンドラを含む構造体を格納すべきだと思う。 size_t id、特定のコールバックを削除したい場合はそのハンドラを提供する必要があります – stryku

+0

@stryku:「コールバックとそのハンドルが含まれています。 「ハンドラ」(名詞)は、何かを「扱う」ものです。コールバックは、C++でハンドラを書く典型的な方法です。 「ハンドル」は、(とりわけ)オブジェクトを参照できる方法です。 –

答えて

1

あなたがstd::function::targetに基づいて、このような何かを行うことができます通常の機能を扱う場合:

ここ
void callback_1(void) {} 
void callback_2(void) {} 

actionCallbacks = { 
    std::function<void(void)>(callback_1), 
    std::function<void(void)>(callback_2), 
    std::function<void(void)>(callback_1) 
}; 

actionCallbacks.erase(
    std::remove_if(actionCallbacks.begin(), actionCallbacks.end(), [](cb_Action action) { 
     return (*action.target<void(*)(void)>() == callback_1); 
    }), 
    actionCallbacks.end() 
); 

内部callback_1を持つすべての項目が削除されます。

+0

同じ問題が発生します。 'std :: function 'と 'std :: function 'を比較します。あなたの例のcallback_1はactionCallbacksにプッシュバックされています。だから私は直接比較メソッドでcallback_1を使用することはできませんし、私はcb_Actionを使用すると、まだ動作していません。 – frankish

+0

@frankishどういう意味なのかよく分かりません。このメソッドは、関数へのポインタを完全に有効な方法で比較します。 'callback_1'を直接使用できないのはなぜですか? –

関連する問題