Вы можете сделать что-то вроде того, что сказал Матье, написать отдельные функции для каждого типа, который вы поддерживаете (он все еще может вызывать функцию шаблона в бэкэнде), или использовать динамический полиморфизм и наследование.Это должны быть единственные варианты, которые вы должны рассмотреть, чтобы делать то, что вы хотите.
Однако вопрос, который вы задаете, заставляет меня поверить, что это неправильное понимание шаблонов и статического полиморфизма.Шаблон функции / класса накладывает ограничение на типы, с которыми он может работать через фактический генерируемый код.Открытый интерфейс, который используется в таких функциях / классах, определяет ограничения на типы, которые могут быть приняты.Нет необходимости накладывать дополнительные ограничения на это.Почему вы хотите ограничить типы, которые шаблон класса / функции может поддерживать больше, чем уже установленные ограничения?
Допустим, вы пишете шаблон функции, который может работать только с типами, которые реализуют открытый интерфейс, состоящий изсредство доступа к жизни, функция уничтожения и функция поедания (в основном, любого живого организма).Это ограничение, которое оно накладывает: вам не нужно ограничивать гибкость, уменьшая количество типов, которые будут работать с шаблоном функции, помимо этого или определяя какие-либо конкретные типы организмов, которые будут работать таким образом.Шаблон уже требует, чтобы этот интерфейс типа живого организма был реализован.