как использовать std :: function для указания на шаблон функции - PullRequest
15 голосов
/ 01 марта 2011
#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;
}

Ответы [ 4 ]

22 голосов
/ 01 марта 2011

В 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 ++. Вот так оно и катится.

17 голосов
/ 01 марта 2011

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

13 голосов
/ 01 марта 2011

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

#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> ;
}
1 голос
/ 01 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...