Если у вас есть шаблон функции, написанный следующим образом:
template <typename T>
void f(T x)
{
x();
}
, вы не сможете создать его экземпляр с любым типом, который не может быть вызван как функция без аргументов (например, тип класса, который перегружает1004 * без аргументов вызывается как функция, которая не принимает аргументов).Если вы попытаетесь это сделать, вы получите ошибку компиляции.
Это самый простой способ требовать, чтобы тип, для которого создается экземпляр шаблона, имел определенные свойства: просто полагайтесь на тип, имеющий эти свойства, когда вы пишетешаблон, и если тип не имеет одного из обязательных свойств, будет невозможно создать экземпляр шаблона с этим типом.