Как использовать std:: function для указания шаблона функции

#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;
}

Ответы

Ответ 1

Нет. Функция шаблона - это именно тот шаблон. Это не настоящая функция. Вы можете указать функцию std:: на конкретную реализацию функции шаблона, например. func<int,int>

Ответ 2

В С++ &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
}

Однако вы не сможете использовать позднюю привязку с квантификаторами универсального типа ( "может применяться к любому типу" ), поскольку "может применяться к любому типу" обязательно разрешается во время компиляции в С++. Это то, как он катится.

Ответ 3

Это то, что вы хотите?

#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> ;
}

Ответ 4

Как указывает Эрик, это невозможно напрямую. Чтобы достичь эффекта, который вы, вероятно, желаете, вам нужно будет сделать код, который использует указатель шаблона.