В C ++ нет такого понятия, как шаблонная функция & mdash; то, что люди обычно называют «шаблонными функциями», на самом деле шаблоны функций : шаблоны, которые определяют функции.
Таким образом, func
в вашем втором примере выше не является функцией, это шаблон (функции), и его нельзя использовать так же, как функцию. В частности, std::function
ожидает, что ему будет предоставлена функция.
Как вы можете обойти это, зависит от того, чего вы пытаетесь достичь. Если вы пытаетесь заставить код, использующий функцию, работать с любым типом, вы можете просто поместить этот код в шаблон функции или класса:
template <typename T>
void use_function(T t) {
typedef std::function<T(T,T)> Funcp = func<T>;
// use Funcp here
}
Однако вы не сможете использовать позднее связывание с квантификаторами универсального типа («может применяться к любому типу»), поскольку «может применяться к любому типу» обязательно разрешается во время компиляции в C ++. Вот так оно и катится.