考虑以下代码:

double computeK(unsigned short choice, double R){
   switch (choice){
      case 1:
        return 1.0/R;
        break;
      case 2:
        return log(R);
        break;
      case 3:
        return exp(-R);
        break;
      case 4:
        return exp(-R*R);
        break;
      case 5:
        return exp(-R);
        break;
      default:
        return 1.0/R/R;
        break;
   }
}

用户针对他从输入文件中调用的另一个类的不同R值,用户多次调用此函数,但是choice的值对于每个输入文件均保持不变。有没有办法避免这个switch语句? (我可以编写一个makefile,为choice设置适当的标签,并要求用户更改makefile中标签的值,但用户希望从其输入文件中调用该函数而不对makefile进行更改。)

如果您能提供相关的代码,也将不胜感激。

谢谢

最佳答案

C++方法如下所示:

更新由于它显然不明显,因此已修复:

  • 会使开关退出循环(您说choice对于所有值都将保持相同)。开关仅完成一次
  • 要小心,允许编译器将完全内联到computeK调用(函数指针不一定是这种情况,尽管如今编译器很聪明,有时会发现这样做的能力)。当调用被实际计算包围时,这可能会成为性能上的一个大胜利。

  • 码:
    #include <vector>
    #include <cmath>
    
    template <typename ComputeK>
       void RunBatch(std::vector<double> const& data, ComputeK const& computeK)
    {
        for (double element : data)
        {
            double k = computeK(element); // TODO useful work
        }
    }
    
    int main()
    {
        int choice = 3; // TODO input
        std::vector<double> data(10000); // Demo only, could be streamed from input
        switch (choice){
            case  0: RunBatch(data, [] (double R) { return   1.0/R;     }); break;
            case  2: RunBatch(data, [] (double R) { return   log(R);    }); break;
            case  3: RunBatch(data, [] (double R) { return   exp(-R);   }); break;
            case  4: RunBatch(data, [] (double R) { return   exp(-R*R); }); break;
            case  5: RunBatch(data, [] (double R) { return   exp(-R);   }); break;
            default: RunBatch(data, [] (double R) { return 1.0/R/R;     }); break;
        }
    }
    

    关于c++ - 避免使用switch语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17665647/

    10-14 08:25