2011-03-01 82 views
13
#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; 
} 

但是有可能指向模板函数吗?如何使用std :: function指向函数模板

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

回答

14

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

+7

+1。真的,“模板函数”这个术语有误导性,“函数模板”更准确。 – suszterpatt 2011-03-01 10:27:46

+0

这是一个很好的答案,但有点误导。你说'不',然后继续解释为什么答案是'是的,如果你实例化'。 – aboveyou00 2016-05-09 21:04:37

1

正如Erik指出的,这是不可能的。为了达到你想要的效果,你必须将使用指针的代码作为模板。

18

有没有这样的东西在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++编译时解决。这就是它如何滚动。

11

这是你想要的吗?

#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> ; 
} 
相关问题