Почему 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.