За шесть лет, прошедших с тех пор, как об этом спросили, ситуация несколько улучшилась! Я опубликую краткое обновление.
➽ std::enable_if
теперь можно использовать в третьем месте, что избавляет от проблемы с некоторыми функциями, просто не имеющими места в подписи, чтобы прикрепить ее. Это должно использовать конечные фиктивные аргументы шаблона.
public:
template<typename R ,
typename = std::enable_if_t<is_range_t<R>::value> >
Fizzer_t (const R& range_of_itemdefs);
➽ Введение alias templates
означает, что вам не нужно template
⋯ ::type
везде! Одно это большое улучшение. Они также упрощают связывание ограничений для их повторного использования или просто детализируют их в другом месте, чем сигнатура ограниченной функции.
➽ Выражение SFINAE и declspec
означает, что вы можете просто показать тип синтаксиса кода, с которым вы хотите работать, и отклонить функцию, если это не так.
➽ Обработка возвращаемых типов работает вместе с этим, поэтому вы можете использовать аргументы функции вместе и иметь возможность поместить выражение SFINAE, чтобы выяснить его действительность.
➽ Выше, а также некоторые вещи, которые уже были выяснены и упакованы в форме библиотеки / идиомы, дают нам более идиоматические (читаемые) ограничения, включая идиома обнаружения .
➽ constexpr
был назван переломным моментом для метапрограммирования шаблонов в целом. Вам не нужно использовать метафункции для выполнения простой арифметики.
constru Конструкция if constexper
может устранить необходимость написания таких ограничений как часть перегрузки!
➽ Если вы хотите быть на переднем крае, Concepts Lite почти готовы и уже являются экспериментальными в некоторых компиляторах. Существуют и другие решения для систематической эмуляции большинства из них.