Почему std::binary_function<...> не имеет метода operator()?

Я заметил, что std::binary_function<...> это только структура с typedefs. По ссылке конкретно сказано:

двоичная_функция не определяет operator(); ожидается, что производные классы будут определять это.

Это кажется бессмысленным для меня. Какой смысл в этом классе (или структуре), если вы можете унаследовать его или создать его экземпляр, вообще не имея функции? Или семантика отличается от той, что мне кажется?

3 ответа

Решение

Помните, что C++11 устарел, а C++17 удаляет binary_function,

binary_function был просто помощником для создания typedefs, используемых (также теперь устаревшими) функциональными адаптерами, например not2, Помните, что раньше auto а также decltype были доступны, было трудно или невозможно вывести эти типы, поэтому они должны были быть предоставлены вручную. Кроме того, какой смысл определять operator()? Не может быть возможной реализации и сделать это pure virtual будет значительным снижением производительности.

Во-первых, нет реализации operator() это может быть помещено в базовый класс, и это будет полезно.

Во-вторых, любое "нормальное" использование класса, полученного из binary_function будет в какой-то момент позвонить operator() в любом случае, приводя к ошибке компилятора, если класс не реализует ее. Это потому что binary_function не является полиморфным базовым классом - никто никогда не должен пытаться вызвать operator() через указатель или ссылку на binary_function,

Если это поможет разобраться в ситуации, подумайте о binary_function как тег или миксин, а не как интерфейс.

Что касается того, почему это не полиморфный базовый класс с чисто виртуальным operator()Стандартные библиотеки просто не были разработаны таким образом. Они были разработаны для использования шаблонов, а не полиморфизма во время выполнения. Полиморфные оболочки функторов были добавлены в C++11 как std::function, но binary_function не имеет к этому никакого отношения.

Это ответ в тексте, который следует сразу же за вашей цитатой.

Некоторые стандартные адаптеры объектов функций библиотеки, такие как std::not2, требуют, чтобы для объектов функций, которые они адаптируют, были определены определенные типы; Для std:: not2 требуется, чтобы функциональный объект имел два типа с именем first_argument_type и second_argument_type. Получение функциональных объектов, которые принимают два аргумента из функции binary_function, - это простой способ сделать их совместимыми с этими адаптерами.

Это цель std::binary_function, Чтобы гарантировать определенные typedefs.

Другие вопросы по тегам