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

时间:2011-03-01 10:19:52

标签: 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;
}

但可以指向模板功能吗?

#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 个答案:

答案 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指出的那样,这是不可能的。为了达到您可能想要的效果,您必须使用指针作为模板的代码。