Предикат общего указателя;

Мне действительно трудно понять эти декларации

        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 (сравнение), это дает ошибку? Почему ошибка? почему я должен указывать bool *, а не bool в качестве предикатов, подобных функциям алгоритма, опять же, какая польза от сравнения в фигурных скобках в элементе {сравнения}? он будет вставлять объекты в мультимножество в отсортированном порядке? если бы я не дал {сравнить}, что случилось бы?

1

Решение

Тип, ожидаемый multiset Второй параметр является сказуемое. Это тип объекта c такой, что c(lhs, rhs) возвращает что-то конвертируемый в bool.

Тип compare а также decltype(compare) является bool(shared_ptr<int>, shared_ptr<int>), тип функции. Там не может быть значения тип функции, но могут быть значения указатели а также Рекомендации в типы функций. Вот почему вам нужно * там. (На самом деле, есть значения типы функций и это те вещи, которые вы объявляете как функции, но они не могут быть созданы, скопированы или почти что-либо, кроме как вызывать их и получать их адрес.) Подводя итог:

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

который является указателем на функцию, принимающую два shared_ptr<int>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<int> const& (то же самое, что const shared_ptr<int>&), поскольку вам на самом деле не нужна копия, и эти копии должны содержать счетчик ссылок, который является операцией, которая должна быть синхронизирована между потоками.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]