enable_if
более гибкий
Я думаю, вы действительно должны предпочесть подход enable_if: он включает все, что вам может потребоваться, и даже больше.
например. Могут быть случаи, когда производный класс имеет значение Liskov-Subsitutable для Base, , но вы [не можете предположить / не хотите применять] те же черты / специализации, чтобы быть действительными (например, потому что Base - это класс POD, тогда как производное и не POD поведение или что-то подобное, что полностью ортогонально по отношению к составу класса).
enable_if
дает вам возможность точно определить условия.
Гибридный подход
Вы также можете достичь некоторого среднего уровня, реализовав класс черт, который выводит некоторые черты, специфичные для приложения, из черт общего назначения. «Пользовательские» черты могут использовать методы enable_if и метапрограммирования, чтобы применять черты так полиморфно, как вы пожелаете. Таким образом, ваши фактические реализации не должны повторять какой-то сложный танец enable_if / dispatch, а вместо этого могут просто потреблять класс custom-traits (который скрывает сложность).
Я думаю, что некоторые (многие?) Библиотеки Boost используют гибридный подход (я видел его в некоторой степени, когда он соединяет, например, fusion / mpl, я думаю, что также различные черты итератора в Spirit).
Мне лично нравится такой подход, потому что он может эффективно изолировать «сантехнику» от основной деятельности библиотеки, делая обслуживание и документацию (!) Намного проще.