我努力做到以下幾點:如何使升壓unordered_map支持輕量級<string>
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> > map;
boost::flyweight<std::string> foo(name);
map[foo] = foo;
但是編譯器會抱怨: 「錯誤C2665:‘提高:: HASH_VALUE’:沒有17個重載的可能轉換所有參數類型「。
但我已經定義了以下功能:
std::size_t hash_value(const boost::flyweight<std::string> & b)
{
boost::hash<std::string> hasher;
const std::string & str = b.get();
return hasher(str);
}
bool operator==(const boost::flyweight<std::string>& f, const boost::flyweight<std::string> & second)
{
return f.get() == second.get();
}
但doesn't編譯。
我需要做些什麼來提高unordered_map以支持flyweight?
[編輯] 我把它用下面的代碼工作:
struct flyweight_hash
{
std::size_t operator()(const boost::flyweight<std::string> &elm) const
{
boost::hash<std::string> hasher;
const std::string & str = elm.get();
return hasher(str);
}
};
,並通過它作爲一個模板參數的圖譜的構建:
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> , flyweight_hash > map;
在這種情況下,我不明白重載hash_value的方式沒有奏效。
這只是不好的,因爲'boost :: unordered_map'的默認哈希似乎並沒有通過boost :: hash_value觸發ADL;返回hash_value(key);'。儘管我現在無法檢查。 – Xeo 2012-01-01 21:34:51
@Xeo默認的hasher應該是'boost :: hash',而不應該是'unordered_map'特有的。至少文件是這樣說的。 – pmr 2012-01-01 21:47:53
當然,但這並不會改變ADL啓用的調用似乎沒有被使用。 – Xeo 2012-01-01 21:49:44