1

キーの型が std::tr1::function を使用しているコールバック関数を含む構造体である std::tr1::unordered_map を形成しようとしています。私は 2 つの問題に直面しています。2)関数オブジェクトから通常の関数ポインタ(またはハッシュに使用できるもの)を取得できないため、ハッシュ関数を実装する方法がわかりません。

コード例は次のとおりです。

#include <boost/functional/hash.hpp>
#include <boost/tr1/functional.hpp>
#include <boost/tr1/unordered_map.hpp>
#include <iostream>

int f(int) {}
typedef std::tr1::function<int(int)> callback;

struct Record
{
  callback func;
  // More members...

  // Requirements for unordered_map key.
  friend bool operator==(Record const & lhs, Record const & rhs)
    { return lhs.func == rhs.func; } // error: ambiguous
  friend std::size_t hash_value(Record const & arg)
    { return boost::hash<void *>(arg.func.get()); } // error: no member get()
};

int main()
{
  std::tr1::unordered_map<Record, int> map;
  Record a = {f};
  map[a] = 0;

  return 0;
}

最初のエラーの詳細は次のとおりです。

test.cpp: In function bool operator==(const Record&, const Record&):
test.cpp:16: error: ambiguous overload for operator== in lhs->Record::func == rhs->Record::func
test.cpp:16: note: candidates are: operator==(void (boost::function1<int, int>::dummy::*)(), void (boost::function1<int, int>::dummy::*)()) <built-in>
<root>/boost/function/function_template.hpp:1024: note:                 void boost::operator==(const boost::function1<R, T0>&, const boost::function1<R, T0>&) [with R = int, T0 = int]

2 番目のエラーについては、明らかに function<...>::get メンバーはありませんが、代わりに何を使用すればよいでしょうか?

Boost バージョン 1.42 と g++ 4.2.2 を使用しています。助けてくれてありがとう。

アップデート

投稿された質問に対する答えは「できません」です。tr1::function オブジェクトは (boost::hash などを使用して) ハッシュ可能ですが、等値比較はできません。ハッシュ キーで関数を使用する場合は、アプローチを再考するか、回避策を見つけてください。

4

3 に答える 3

2

TR1は特にそれを必要としているように思われます

template<class Function2> bool operator==(const function<Function2>&);
template<class Function2> bool operator!=(const function<Function2>&);

未定義のまま(3.7.2.6)なので、少なくとも平等を得るための別の方法を見つける必要があります。さらに、私はget()この論文でもメンバーメソッドへの言及を見つけていません。

于 2011-12-08T01:47:16.043 に答える
2

hash_value に関しては、私自身の質問に答えることができます。これは、tr1::関数でboost::hashを呼び出す正しい方法です:

friend std::size_t hash_value(Record const & arg)
{
  boost::hash<callback> hasher;
  return hasher(arg.func);
}
于 2011-12-08T18:35:34.460 に答える
0

ここここ でfunction::target説明されているいくつかのアイデアがあります。Boost.Signalsライブラリは、コールバックの登録をサポートするように設計されているため、検討することもできます。

于 2011-12-08T04:37:33.747 に答える