代码之家  ›  专栏  ›  技术社区  ›  Abhimanyu Bhadauria

块范围中的函数指针定义

  •  -1
  • Abhimanyu Bhadauria  · 技术社区  · 6 年前

    我有这样一个代码段。

    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;}
    

    我打算使用相同的函数指针(此处 优化 )根据用户输入指向不同的功能。类似地,我还有另一个函数指针 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公司 优化 不在范围内,因为它们是在if语句中声明的。

    有没有办法做到这一点?也就是说,保持 foo公司 优化 在范围内,直到项目结束。 谢谢

    1 回复  |  直到 6 年前
        1
  •  1
  •   user1118321    6 年前

    您应该从定义函数指针的类型开始。类似这样:

    typedef double (*FooFunc)(int, const MatrixXd&);
    typedef double (*OptimizeFunc)(int, const VectorXd&);
    

    接下来,您可以定义 if :

    FooFunc foo;
    OptFunc optimize;
    

    然后在 如果 :

    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.
    }