void指向模板函数的指针

时间:2013-03-04 19:42:05

标签: c++ templates pointers void

假设这不是我管理的模板功能:

template<class T, class U>
U templatefunc(T t){ //(...); }

我可以使用默认参数作为类型

的模板函数的函数
templatefunc<int,double> 

然后如何声明void指针,所以我可以这样做:

void _new_func( const void*=&templatefunc<int,double>)

我认为不行,因为你不能有无效的指针指向函数,它必须是函数指针,对吗?

之前是:

void _new_func(const void* = boost::test_tools::check_is_close) 

但是使用boost 1.54则不行,因为check_is_close是模板。

2 个答案:

答案 0 :(得分:1)

模板函数实例化是一个函数,因此您可以使用函数执行任何操作,也可以使用模板函数实例化。但是,无论函数是普通函数还是模板函数实例化,都无法在void*中可移植地存储函数的地址。

答案 1 :(得分:1)

&templatefunc<int,double>的类型是指向函数返回double并使用类型int的一个参数的指针。模板参数不再重要 - templatefunc<int,double>只是(实例化)函数的名称。所以你可以:

void _new_func(double(*func)(int) = &templatefunc<int,double>)

但是,您似乎想要使用具有不同参数和返回类型的函数。在这种情况下,对于不传递参数的情况,可能会出现重载:

template <typename T, typename U>
void _new_func(U(*func)(T)) {
}

void _new_func() {
  _new_func(&templatefunc<int,double>);
}

现在您可以调用_new_func(),它会将函数指针&templatefunc<int,double>传递给模板化版本。如果您想使用_new_func的不同实例调用templatefunc,您可以执行以下操作:

__new_func(&templatefunc<float, double>);