对此肯定有一个简单的答案。

我有一个std::set或std::map或某种具有自然顺序的对象类型-说std::less。

我需要更改集合或映射以包含shared_ptr而不是T的副本。

所以我想要类似的东西:

using my_set std::set<std::shared_ptr<T>, std::less<*T>>;

但是我在如何指定“在T的____适配器上使用less适配器,以便它在已取消引用的成员上,而不在shared_ptrs上!”一词空白。

有等效的std::less<std::dereference<std::shared_ptr<T>>>吗?

最佳答案

虽然标准库可能尚未满足您的需求,但是我认为编写自己的std::dereference_less很简单:

#include <memory>
#include <set>

namespace std
{
    template<typename T>
    struct dereference_less
    {
        constexpr bool operator ()(const T& _lhs, const T& _rhs) const
        {
            return *_lhs < *_rhs;
        }
    };
}

int main()
{
   using key_type = std::shared_ptr<int>;
   std::set<key_type, std::dereference_less<key_type>> mySet;
}

Demo(经过重构,具有类似您问题中的模板类型别名)

关于c++ - 如何简单地调整指针的集合或映射顺序谓词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39960165/

10-11 22:38
查看更多