是否可以以及如何隐式地使用std::shared_ptr<std::string>
作为索引for boost::multi_index_container
?
这个代码
struct Item
{
std::shared_ptr<std::string> shared_id;
};
using ItemsIndexed = boost::multi_index_container<
Item,
boost::multi_index::indexed_by<
boost::multi_index::ordered_non_unique<
boost::multi_index::member<Item, std::string, &Item::shared_id>>>>;
(compiler explorer link)
给出错误value of type 'std::shared_ptr<std::string> Item::*' is not implicitly convertible to 'std::string Item::*'
或者唯一的方法是提供密钥提取器,它将取消引用shared_pointer:
struct Item
{
std::shared_ptr<std::string> shared_id;
std::string shared_id_extractor() const
{
return *shared_id;
}
};
using ItemsIndexed = boost::multi_index_container<
Item,
boost::multi_index::indexed_by<
boost::multi_index::ordered_non_unique<
boost::multi_index::
const_mem_fun<Item, std::string, &Item::shared_id_extractor>>>>;
1条答案
按热度按时间rta7y2nd1#
这取决于你想用什么作为密钥:
member<Item, std::shared_ptr<std::string>, &Item::shared_id>
将使用指针作为键,也就是说,如果两个元素指向同一个字符串,则它们相等。const_mem_fun<Item, std::string, &Item::shared_id_extractor>
将使用实际字符串作为键,也就是说,如果指向比较的字符串相等,则两个元素相等。我知道你在找最后一个选择,但我还是想提一下另外一个以防万一。没有比您描述的更简单的方法来使用字符串作为键(对于您的场景)。您可以通过以下方式避免创建临时字符串:https://godbolt.org/z/ehjvvfxP1