1

假设这不是我管理的模板函数:

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

我可以有一个默认参数是模板函数类型的函数吗

templatefunc<int,double> 

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

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

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

以前是:

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

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

4

2 回答 2

1

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

于 2013-03-04T19:49:15.993 回答
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>);
于 2013-03-04T19:50:26.180 回答