gpt4 book ai didi

c++ - 如何使 boost unordered_map 支持 flyweight

转载 作者:可可西里 更新时间:2023-11-01 15:55:51 26 4
gpt4 key购买 nike

我正在尝试执行以下操作:

boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> > map;

boost::flyweight<std::string> foo(name);
map[foo] = foo;

但是编译器提示:“错误 C2665:‘boost::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();
}

但它无法编译。

我需要做什么才能使 boost unordered_map 支持享元?

[编辑]我让它与以下代码一起工作:

    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);
}
};

并将其作为模板参数传递给 map 的构建:

boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> , flyweight_hash > map;

在这种情况下,我不明白重载 hash_value 的方式不起作用。

最佳答案

boost::hash 通过参数相关查找 (ADL) 调用 hash_value。您正在尝试为命名空间 boost 中的类定义一个 hash_value 函数。因此,您的 hash_value 函数也需要进入此命名空间,ADL 才能正常工作。不幸的是,向外部 namespace 添加函数是相当邪恶的,应该避免。您使用自定义散列器的解决方案似乎不错。

一个小示例代码来说明:

namespace boost {
// somewhere in boost
template<typename T>
std::size_t hash(const T& t) {
// call using ADL
// e.g. if called with object of class type foo::bar this will
// pick up foo::hash_value despite the lack of namespace
// qualification
return hash_value(t);
}
}

// your hash_value (presumably in the global namespace)
// not picked up by above call
std::size_t hash_value(boost::flyweight<T>...);

namespace boost {
// this would be picked up but is slightly evil
std::size_t hash_value(boost::flyweight<T>...);
}

关于c++ - 如何使 boost unordered_map 支持 flyweight<string>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8695379/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com