如何使用std :: function指向函数模板

hid*_*yat 16 c++ templates function-pointers

#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;
}
Run Code Online (Sandbox Code Playgroud)

但是有可能指向模板功能吗?

#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;
}
Run Code Online (Sandbox Code Playgroud)

Vic*_*let 24

在C++中没有模板函数这样的东西- 人们随便提到的"模板函数"实际上是函数模板:定义函数的模板.

因此,func在上面的第二个例子中,上面不是函数,它是一个(函数)模板,它不能以与函数相同的方式使用.特别是,std::function期望提供功能.

如何解决这个问题取决于你想要达到的目标.如果您尝试使用该函数的代码可以使用任何类型,您只需将该代码放在函数或类模板中:

template <typename T>
void use_function(T t) {
  typedef std::function<T(T,T)> Funcp = func<T>;
  // use Funcp here
}
Run Code Online (Sandbox Code Playgroud)

但是,您将无法使用通用类型量词的后期绑定("可以应用于任何类型"),因为"可以应用于任何类型"必须在C++的编译时解析.这就是它如何滚动.


Eri*_*rik 19

不.模板功能就是模板.这不是一个真正的功能.您可以将std :: function指向模板函数的特定实例,例如func<int,int>

  • +1.实际上,术语"模板功能"具有误导性,"功能模板"更准确. (13认同)

Ton*_*nyK 14

这是你想要的吗?

#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> ;
}
Run Code Online (Sandbox Code Playgroud)