Я перечислю последствия каждой альтернативы, а затем решу, какой вариант лучше всего подходит для данного конкретного случая.
Если опция шаблона может (преждевременно беспокоиться?) Раздувать объектный код, то альтернатива полиморфизма может сделать исходный код излишне сложным.
В случае шаблонов компилятор создаст другой класс Button
для каждого объекта функции, с которым вы его создаете. Это означает, что код объекта продукта будет больше, чем если бы у вас был один класс Button
, который принимает различные объекты действия через подкласс.
В случае полиморфизма компилятор сгенерирует один класс Button
, но теперь у вас будет другой базовый класс для обслуживания, и вы будете вынуждены создавать его подкласс для любого нового действия, добавляемого в вашу коллекцию. В частности, вы не сможете использовать действия, которые были написаны до того, как вы создали базовый класс действий, если вы не можете изменить их, чтобы они были производными от этого класса действий.
Альтернатива шаблона позволяет вам использовать все, что соответствует интерфейсу шаблона. Поэтому, если вы используете параметр шаблона в качестве функции, вы можете принять все, что можно вызвать, как функцию. Это означает, что вам даже не нужно рассматривать альтернативу указателей на функции, поскольку шаблоны позволяют вам принимать указатели на функции - и многое другое.
Опция полиморфизма подразумевает, что компилятор знает больше о том, что вы пытаетесь сделать. Другими словами, шаблоны идут с ошибками шаблонов.
Вы можете облегчить некоторые проблемы с шаблоном, если сможете найти способ только для шаблонных Button
функций-членов, а не для всего класса Button
. Возьмите в качестве параметра функции экземпляр шаблона, чтобы вам не нужно было явно создавать экземпляр функции шаблона. Тогда вы выиграете как по некоторым из преимуществ шаблона, так и по ряду преимуществ полиморфизма.