我正在尝试形成一个std :: tr1 :: unordered_map,其中键类型是一个包含回调函数的结构,我正在使用std :: tr1 :: function。我遇到了两个问题:1)函数对象似乎没有可比性,正如Boost.Function文档所示; 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]
对于第二个错误,显然没有函数&lt; ...&gt; :: get member,但我应该使用什么呢?
我正在使用Boost版本1.42和g ++ 4.2.2。谢谢你的帮助。
发布的问题的答案是“你做不到”。 tr1 :: function对象是可散列的(例如,使用boost :: hash),但不具有可比性。如果要在哈希键中使用函数,请重新考虑该方法或找到解决方法。
答案 0 :(得分:2)
似乎TR1特别要求
template<class Function2> bool operator==(const function<Function2>&);
template<class Function2> bool operator!=(const function<Function2>&);
保持未定义(3.7.2.6),所以至少你必须找到另一种方法来获得平等。此外,我也没有在论文中找到任何get()
成员方法的参考。
答案 1 :(得分:2)
我可以回答关于hash_value的问题。这是使用tr1 :: function调用boost :: hash的正确方法:
friend std::size_t hash_value(Record const & arg)
{
boost::hash<callback> hasher;
return hasher(arg.func);
}
答案 2 :(得分:0)
有一些想法使用function::target
讨论here和here。您可能还需要考虑Boost.Signals库,因为它旨在支持回调注册。