有没有办法将带有两个参数的函数指针设置为具有更少或不同参数的函数。
假设我有
double func1(double x);
我想要一个函数指针
double (*f)(double x, void *void_ptr)
设置f=func1;是错的。那么是否可以以某种方式进行投射?
此外,是否可以强制转换类似的函数
double calc(double x, const XYZ *xyz)
实现f=calc;?
我已经尝试过 f=func1;和静态类型转换。编译器总是说不可能进行转换。
函数指针
double (*f)(double x, void *void_ptr)
指向具有两个参数的函数,而不是具有不同签名的函数。不过,选角不是这里的问题。你可以将指向
double func1(double x);
的指针转换为上面的函数指针类型,但是得到的指针是无用的,你不能用它来调用函数。
从概念上讲,它与普通指针类似。简而言之,如果您没有该类型的对象但有不同类型的对象(通过
char*
等人进行别名),则指向该类型对象的指针几乎没有什么用处。
您可以使用所需的签名编写函数,然后获取指向它的指针:
double foo(double x,void*) { return func1(x); }
using fun_type = double(*)(double,void*);
fun_type f = &foo;
但是,当您请求这样的东西时,表明裸函数指针一开始就是错误的工具。 Lambda 表达式和
std::function
更容易使用。也许您实际上只需要一个具有正确签名的可调用对象,即没有比以下更复杂的了:
auto f = [](double x,void*) { return func1(x); };