【问题标题】:Shared pointer predicate;共享指针谓词;
【发布时间】:2013-06-19 14:30:45
【问题描述】:

我真的很难理解这些声明

        static bool compare ( const shared_ptr<int> lhs,const shared_ptr<int> rhs )
                    { return (*lhs) < (*rhs) ; }
        multiset<shared_ptr<int>,decltype(compare)*> item{ compare } ;

如果我在 decltype(compare) 之后没有给出指针,它会给出错误吗?为什么会出错?为什么我应该提供 bool* 而不是 bool 作为算法函数的谓词,再次在 item { compare } 的花括号中给出 compare 的好处是什么?它会按排序顺序在多集中插入对象吗?如果我没有给出 { compare } 会发生什么?

【问题讨论】:

  • 提示:decltype(compare) 不是对compare 的调用返回的类型。
  • 比较的返回类型不是bool吗??
  • 但是compare的类型和它的返回类型不一样。
  • 为什么???我的知识真的很少..请解释一下。
  • OK,compare 是某种返回 bool 的静态函数。 decltype(compare) 是该函数的类型。 item 是一个multimap,使用compare 作为比较函数来实现其元素的排序。

标签: c++ shared-ptr decltype multiset


【解决方案1】:

multiset 第二个参数所期望的类型是一个谓词。这是c 对象的类型,这样c(lhs, rhs) 返回的东西可转换为bool

comparedecltype(compare) 的类型是bool(shared_ptr&lt;int&gt;, shared_ptr&lt;int&gt;),一个函数类型。不能有函数类型的值,但可以有指针引用函数类型的值.这就是您需要* 的原因。 (实际上,有函数类型的值,并且是那些你声明为函数的东西,但是除了调用它们并获取它们的地址之外,它们不能被创建、复制,也几乎没有任何东西。)总结一下:

decltype(compare)* ==> bool (*)(shared_ptr<int>, shared_ptr<int>)

它是一个指向函数的指针,它通过值获取两个shared_ptr&lt;int&gt;s 并返回一个bool。然后,在multiset 构造函数中,给它一个该类型的值:

items{ compare }; // value 

或更具体地说,一个函数类型的值,它将衰减为函数指针类型。所以让我们明确一点:

items{ &compare }; // pointer to function compare

如果你什么都不给它,那么它将是一个空指针,当你试图调用它来进行比较时,你的应用程序会崩溃。

总之,你选择了一个非常复杂的案例来处理(我已经跳过了一些我应该提到的事情)。这是一种更简单的方法:

struct shared_ptr_compare
{
    bool operator()(std::shared_ptr<int> const& lhs, std::shared_ptr<int> const& rhs) const
    { return /*...*/; }
};

multiset<shared_ptr<int>, shared_ptr_compare> item; // no need to initialize 
      // shared_ptr_compare with anything, a default value will do just fine

注意:我删除了顶级 const 修饰符,因为它对函数参数没有影响,它只是向函数体发出无法更改值的信号。所以它确实有意义,但解释类型变得复杂。

注意 2:您应该将这些参数设为 shared_ptr&lt;int&gt; const&amp;(与 const shared_ptr&lt;int&gt;&amp; 相同),因为您实际上不需要副本,并且这些副本必须保留一个引用计数器,即必须在线程之间同步的操作。

【讨论】:

  • 如果声明是这样的.. multiset > item ;那不也有序地插入元素吗?
  • @TamimAdDari 它将根据不同的顺序插入元素:指针值,而不是指针指向的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多