考虑以下代码:
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/