Объявление мультинабора с компаратором с использованием указателей функций - PullRequest
0 голосов
/ 09 июля 2020

Это расширение вопроса, который был задан и дан здесь ответ: Как определить мультимножество с помощью указателя на функцию?

К сожалению, у меня недостаточно репутации, чтобы спросить пользователя с принял ответ на мой вопрос в виде комментария (еще 9 к go ...), так что я здесь. Надеюсь, это было нормально.

Как и в этом вопросе, я также работаю с C ++ Primer и занимаюсь тем же разделом. Используя упрощенный пример, приведенный в приведенной выше ссылке, я пытаюсь понять эту строку:

std::multiset<A, decltype(compareA)*> m1(compareA);

Насколько мне известно, это синтаксис для конструкторов копирования. Например, инициализация мультимножества целых чисел m1 как копии мультимножества m2 записывается как std::multiset<int> m1(m2);.

Итак, что здесь происходит, когда мы используем указатели на функции? Это просто синтаксис c сахар, чтобы тип указателя функции, возвращаемый decltype(compareA)*, указывал на compareA? Я думаю, что я в корне неправильно понимаю, что делает эта строка.

В качестве примечания, как я должен прочитать документацию на std :: multiset , чтобы ответить на этот вопрос? Мне кажется, что документация по C ++ намного менее доступна, чем, например, документация Java, но, возможно, я просто ищу не в том месте.

1 Ответ

1 голос
/ 09 июля 2020

Строка std::multiset<A, decltype(compareA)*> m1(compareA) определяет объект с именем m1 типа std::multiset<A, decltype(compareA)*> и передает compareA в качестве параметра его конструктору. Второй параметр шаблона

std::multiset - это введите компаратора для использования. В данном случае это decltype(compareA)*: указатель на тип compareA. Вероятно, что-то вроде bool (*)(const A&, const A&): указатель на функцию, возвращающую bool и принимающую два параметра A по константной ссылке. Этот тип сам по себе не может выполнять никаких сравнений, вам нужен фактический объект этого типа, который указывает на заданную c функцию. Обычно std::multiset инициализирует значение объекта его типа компаратора, но для типа указателя функции, который будет нулевым указателем. Чтобы справиться с этим, std::multiset имеет конструктор (конструктор (1) на этой странице), который принимает объект своего типа компаратора, который он будет использовать для своих сравнений. Имена функций неявно преобразуются в указатель на эту функцию, поэтому передача compareA эквивалентна &compareA.

Взяв все вместе, тип компаратора m1 - «Указатель на функцию, принимающую два A с ». Вы передаете указатель на compareA его конструктору, который затем будет использовать для вызова compareA для выполнения необходимых ему сравнений.

...