Виртуальные функции с двумя операндами, которые могут принимать разные типы. - PullRequest
1 голос
/ 04 февраля 2010

Позвольте мне начать с конкретного примера. В C ++ у меня есть иерархия классов в рамках абстрактного базового класса CollisionVolume. Любой объем столкновения должен быть в состоянии detectCollision с любым другим объемом. Этот код столкновения специализируется на основе присутствия двух подклассов, но он коммутативен: detectCollision(a, b) == detectCollision(b, a).

Мне нужно использовать механизм, аналогичный виртуальным функциям, поскольку объекты обычно имеют абстрактный базовый класс. Однако, если я использую типичные виртуальные методы, выбранная функция может зависеть только от типа одного операнда, а не от обоих. Единственный способ сделать это - использовать RTTI или механизм, похожий на RTTI.

Есть ли более чистый способ сделать это?

Ответы [ 3 ]

2 голосов
/ 04 февраля 2010

Вы ищете многократная отправка . В C ++ его нет, потому что это сложно реализовать эффективно. Большинство других статически типизированных / ориентированных на эффективность языков тоже этого не делают. Ваше решение RTTI, вероятно, является лучшим способом подделки.

1 голос
/ 04 февраля 2010

Существует несколько решений для эмуляции мультиметодов в C ++.

Вот несколько ссылок, которые могут помочь вам решить вашу проблему:

S.Meyers " Более эффективный C ++ ", пункт 31: Создание виртуальных функций по отношению к более чем одному объекту.

А.Александреску " Современный C ++ дизайн ", Глава 11. Мультиметоды

Мультиметоды в C ++: поиск полного решения Данил Шопырин

Многократная отправка. Новый подход с использованием шаблонов и RTTI от доктора Карло Песчио, C ++ Report, июнь 1998 г.

Проект предложения о добавлении мультиметодов в C ++, здесь и здесь

0 голосов
/ 04 февраля 2010

Моя первоначальная идея, которая после чтения выглядит как шаблон посетителя (?), Состоит в том, чтобы создать виртуальную функцию, которая возвращает некоторую жизненно важную информацию об объекте, а затем в detectCollision() сравнитьжизненно важная информация, возвращаемая двумя объектами.Таким образом, каждый объект может возвращать специализированную информацию, но их можно сравнивать обобщенным образом.

Возможно, это не самый эффективный способ сделать это, но он кажется относительно простым.

...