#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;
}
答案 0 :(得分:21)
在C ++中没有模板函数这样的东西 - 人们随便提到的“模板函数”实际上是函数模板:定义函数的模板。
因此,上面第二个例子中的func
不是函数,它是一个(函数)模板,它不能以与函数相同的方式使用。特别是,std::function
期望提供一个函数。
如何解决这个问题取决于您要实现的目标。如果您尝试使用该函数的代码可以使用任何类型,您可以简单地将该代码放在函数或类模板中:
template <typename T>
void use_function(T t) {
typedef std::function<T(T,T)> Funcp = func<T>;
// use Funcp here
}
然而,你将无法使用通用类型量词的后期绑定(“可以应用于任何类型”),因为“可以应用于任何类型”必须在编译时解决C ++。这就是它如何滚动。
答案 1 :(得分:16)
没有。模板函数就是模板。这不是一个真正的功能。您可以将std :: function指向模板函数的特定实例,例如func<int,int>
答案 2 :(得分:13)
这是你想要的吗?
#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> ;
}
答案 3 :(得分:1)
正如Erik指出的那样,这是不可能的。为了达到您可能想要的效果,您必须使用指针作为模板的代码。