Выбор здесь не является (только) стилистическим: опция A обеспечивает полиморфизм во время выполнения, а опция B обеспечивает полиморфизм во время компиляции.Вы не предоставили нам достаточно информации, чтобы выяснить, какая из них предпочтительна в этом случае.
В общем, мой совет - использовать вариант А, если и только если вы хотите позвонить test
с A*
.С этим приходит предположение, что A
, вероятно, является абстрактным базовым классом (или, по крайней мере, имеет виртуальные функции).В этом случае невозможно даже разумно использовать опцию B, и мы надеемся, что test
будет состоять из вызова некоторых виртуальных функций на A*
с желаемым эффектом (в отличие от dynamic_cast
использования его в грязных целях).
Однако, если вы никогда не собираетесь вызывать test
с A*
, вариант B, как правило, лучше: вы разрешаете использовать функцию с любым типом, и от вызова меньше затрат времени выполнениявиртуальные функции (которые могут быть незначительными, но тем не менее).Это также дает функции несколько большую свободу: например, она может создать другой TType
, если необходимо, что сложнее, если вы передадите ему указатель на абстрактный базовый класс.Наконец, вы можете использовать такие функции, как специализация шаблона и статические утверждения, если вы действительно этого хотите.
В общем, вопрос должен звучать так: «Хочу ли я использовать полиморфизм времени выполнения с этим классом?»;выбор между этими двумя становится очевидным, когда вы решите это.
(Кстати, в случае с шаблоном вы, вероятно, захотите передать TType const&
, а не TType const*
.)