c++ shared_ptr< string>作为boost::multi_index的索引

ohfgkhjo  于 2023-05-13  发布在  其他
关注(0)|答案(1)|浏览(137)

是否可以以及如何隐式地使用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>>>>;

(compiler explorer link)

rta7y2nd

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

相关问题