块作用域中的函数指针定义
Function Pointer Definition in Block Scope
我有一个这样的代码部分。
if (opt_choice == 1){
double (*foo)(int , const MatrixXd& );
double (*optimize)(double (*)(int, const MatrixXd&)) = function1;}
else if (opt_choice == 2){
double (*foo)(int , const VectorXd& );
double (*optimize)(double (*)(int, const VectorXd&)) = function2;}
我打算使用同一个函数指针(这里optimize)根据用户输入指向不同的函数。同样,我还有另一个函数指针 foo,它根据用户的选择采用不同的参数。 foo 稍后被分配给不同的功能。
switch (....)
case 1: foo = someFunction; break; // error : foo is not declared in this scope
case 2: foo = someFunction2; break;
...
最后我希望使用它们各自的函数指针来调用它们。
optimize(var1,foo); // error : optimize is not declared in this scope
正如您可能已经猜到的那样,编译器会在此处抛出错误,因为 foo 和 optimize 自声明后不在范围内在 if 语句中。
有什么办法可以实现吗?也就是说,将 foo 和 optimize 保持在范围内,直到程序结束。
谢谢。
您应该首先为函数指针定义一个类型。像这样:
typedef double (*FooFunc)(int, const MatrixXd&);
typedef double (*OptimizeFunc)(int, const VectorXd&);
接下来,可以定义if
范围外的变量:
FooFunc foo;
OptFunc optimize;
然后在if
里面赋值:
if (opt_choice == 1)
{
optimize = function1;
}
else if (opt_choice == 2)
{
optimize = function2;
}
你从来没有在你的第一个代码片段中分配给 foo
,所以我不知道在那里分配什么,但它应该分配给一个函数指针,它与 FooFunc
类型。对于开关,你会做类似的事情:
switch (...)
{
case 1: foo = <some function with a FooFunc signature>; break
case 2: foo = <some other function with a FooFunc signature>; break;
// ...etc.
}
我有一个这样的代码部分。
if (opt_choice == 1){
double (*foo)(int , const MatrixXd& );
double (*optimize)(double (*)(int, const MatrixXd&)) = function1;}
else if (opt_choice == 2){
double (*foo)(int , const VectorXd& );
double (*optimize)(double (*)(int, const VectorXd&)) = function2;}
我打算使用同一个函数指针(这里optimize)根据用户输入指向不同的函数。同样,我还有另一个函数指针 foo,它根据用户的选择采用不同的参数。 foo 稍后被分配给不同的功能。
switch (....)
case 1: foo = someFunction; break; // error : foo is not declared in this scope
case 2: foo = someFunction2; break;
...
最后我希望使用它们各自的函数指针来调用它们。
optimize(var1,foo); // error : optimize is not declared in this scope
正如您可能已经猜到的那样,编译器会在此处抛出错误,因为 foo 和 optimize 自声明后不在范围内在 if 语句中。
有什么办法可以实现吗?也就是说,将 foo 和 optimize 保持在范围内,直到程序结束。 谢谢。
您应该首先为函数指针定义一个类型。像这样:
typedef double (*FooFunc)(int, const MatrixXd&);
typedef double (*OptimizeFunc)(int, const VectorXd&);
接下来,可以定义if
范围外的变量:
FooFunc foo;
OptFunc optimize;
然后在if
里面赋值:
if (opt_choice == 1)
{
optimize = function1;
}
else if (opt_choice == 2)
{
optimize = function2;
}
你从来没有在你的第一个代码片段中分配给 foo
,所以我不知道在那里分配什么,但它应该分配给一个函数指针,它与 FooFunc
类型。对于开关,你会做类似的事情:
switch (...)
{
case 1: foo = <some function with a FooFunc signature>; break
case 2: foo = <some other function with a FooFunc signature>; break;
// ...etc.
}