Может ли CRTP полностью заменить виртуальную функциональность для небольших проектов? - PullRequest
2 голосов
/ 07 июля 2011

Достаточно ли CRTP , чтобы полностью перехитрить virtual функциональность?

Единственный недостаток, который я вижу в CRTP, - это значительное количество кода, генерируемого для каждого повторяющегося шаблона. Для небольших проектов (где 2-3 класса получены из базы), является ли CRTP лучшей идеей?

Ответы [ 2 ]

15 голосов
/ 07 июля 2011

CRTP не обеспечивает полиморфизм во время выполнения .Если вам нужен полиморфизм времени выполнения, вам нужны виртуальные методы.Хуже того, поскольку базовый класс является шаблонным, вы даже не можете использовать объекты подкласса так, как если бы они были того же типа, что и базовый класс, поскольку вы не можете привести их к этому базовому классу - он не существует;это просто шаблон.

Я думаю, что более полезный способ размышления о CRTP-замене полиморфизма - это не замена виртуального наследования, а скорее форма миксинов .Вы не делаете подклассы в обычном смысле;вместо этого вы добавляете в свой класс готовые функции.

Пример миксина: пример миксина будет выглядеть примерно так: зависит от.Такой миксин может содержать список указателей на другие элементы того же типа, от которых зависит этот элемент;он добавил бы метод register_dependency, который добавляет объект, от которого он зависит, и visit_dependents, который посещает все его зависимости в (обратном?) топологическом порядке.Другим примером может быть то, что добавляет метод compute_area ко всему, что само содержит методы width и height.Или что угодно ...

Если вы думаете об этом как о замене иерархии типов, вы просто усложняете понимание, усложняете отладку кода, который не совсем работает так, как должен.Если вам действительно не нужно увеличение производительности (если оно есть - не гарантировано), это звучит как плохая идея.Если вы делаете это для быстрого склеивания некоторых лишних битов, но без концептуального веса наследования, я бы сказал, что у вас все хорошо - «настоящее» наследование не так часто необходимо.

1 голос
/ 07 июля 2011

Используйте в зависимости от того, что делает дизайн более понятным и его легче кодировать / поддерживать. Если у вас нет существенной причины измерения производительности / пространства для выбора того или другого, почти всегда лучше просто использовать самый простой способ кодирования / отладки / обслуживания.

С CRTP вы должны иметь больше шаблонных методов, чтобы он мог работать с соответствующим базовым классом, что может быть или не быть недостатком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...