1

我真的很难理解这些声明

        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 } 会发生什么?

4

1 回答 1

3

multiset第二个参数预期的类型是Predicate。这是一个对象的类型,cc(lhs, rhs)返回可转换为bool的东西。

compareand的类型decltype(compare)函数类型。不能有函数类型的值,但可以有指针的值和对函数类型的引用。这就是为什么你需要那里。(实际上,有函数类型的值,并且是您声明为函数的那些东西,但是除了调用它们并获取它们的地址之外,它们不能被创建、复制,也几乎没有任何东西。)总结:bool(shared_ptr<int>, shared_ptr<int>)*

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

这是一个指向函数的指针,该函数采用两个shared_ptr<int>s 的值并返回 a 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<int> const&(与 相同的东西const shared_ptr<int>&),因为您实际上不需要副本,并且这些副本必须保留一个引用计数器,这是一个必须在线程之间同步的操作。

于 2013-06-19T06:25:07.067 回答