7

ベクトルにコールバック関数が設定されており、追加する前に関数へのコールバックが既に存在するかどうかを確認したいと考えています。それが機能するかどうかはわかりませんが、これまでのところコンパイルさえしていません。

vector<std::function<void(void*)>> _callbacks;

void Event::RegisterCallback(std::function<void(void*)> callback)
{
    if (callback == NULL)
        return;

    vector<std::function<void(void*)>>::iterator it = std::find(_callbacks.begin(), _callbacks.end(), callback);

    if (it == _callbacks.end())
    {
        _callbacks.push_back(callback);
    }
    else
    {
        //print error
        throw;
    }
}

これにより、alorithm(805) で「オーバーロードの解決により削除された演算子 '==' が選択されました」というコンパイル エラーが発生します。これは、find 関数呼び出しに関連しています。

これを機能させるにはどうすればよいですか?関数呼び出しを同じメソッドと適切に比較することさえできますか?

ありがとう

4

2 に答える 2

2

コメントに記載されているように、最も簡単な解決策は、デフォルトの C スタイルの関数ポインターを使用することです。これは、演算子をサポートしていない==C++11 とは対照的にサポートされているためです。function

using func_type = void(*)();
vector<func_type> _callbacks;

void Event::RegisterCallback(func_type callback)
{
    if (callback == nullptr)
       return;

    auto it = std::find(_callbacks.begin(), _callbacks.end(), callback);

    if (it == _callbacks.end()) {
        _callbacks.push_back(callback);
    }
    else {
        throw;
    }
}

void f() {};
void g() {};

/*
    evt.RegisterCallback(f); // works fine
    evt.RegisterCallback(g); // works fine
    evt.RegisterCallback(f); // throws exception
*/

このアプローチが気に入らない場合は、等価演算子をサポートする独自の関数ポインター クラスを作成できます。

于 2013-09-07T15:52:19.237 に答える