Ответ 1
Нет. Функция шаблона - это именно тот шаблон. Это не настоящая функция. Вы можете указать функцию std:: на конкретную реализацию функции шаблона, например. func<int,int>
#include <functional>
int func(int x, int y)
{
return x+y;
}
int main()
{
typedef std::function<int(int, int)> Funcp;
Funcp funcp = func;
return 0;
}
Но можно ли указать на функцию шаблона?
#include <functional>
template<class T>
T func(T x, T y)
{
return x+y;
}
int main()
{
typedef std::function<?(?, ?)> Funcp;
Funcp funcp = func;
return 0;
}
Нет. Функция шаблона - это именно тот шаблон. Это не настоящая функция. Вы можете указать функцию std:: на конкретную реализацию функции шаблона, например. func<int,int>
В С++ &mdash нет такой функции, как функция шаблона; то, что люди случайно упоминают как "функции шаблона", на самом деле являются функциональными шаблонами: шаблонами, которые определяют функции.
Таким образом, func
в вашем втором примере выше не является функцией, это шаблон (function), и он не может использоваться так же, как функция. В частности, std::function
ожидает предоставления функции.
Как вы можете обойти это, зависит от того, чего вы пытаетесь достичь. Если вы пытаетесь сделать код, который использует эту функцию, работать с любым типом, вы можете просто поместить этот код в шаблон функции или класса:
template <typename T>
void use_function(T t) {
typedef std::function<T(T,T)> Funcp = func<T>;
// use Funcp here
}
Однако вы не сможете использовать позднюю привязку с квантификаторами универсального типа ( "может применяться к любому типу" ), поскольку "может применяться к любому типу" обязательно разрешается во время компиляции в С++. Это то, как он катится.
Это то, что вы хотите?
#include <functional>
template<class T>
T func(T x, T y)
{
return x+y;
}
template<typename T> struct FunctionType
{
typedef std::function<T(T, T)> Type ;
} ;
int main()
{
FunctionType<int>::Type Funcp = func<int> ;
}
Как указывает Эрик, это невозможно напрямую. Чтобы достичь эффекта, который вы, вероятно, желаете, вам нужно будет сделать код, который использует указатель шаблона.