假设这不是我管理的模板功能:
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是模板。
答案 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>);