是否可以写一个循环而不检查里面的条件,而不重复代码

问题描述 投票:0回答:1

这不是我第一次遇到这样的情况:内部存在循环,代码依赖于外部环境 例如:

bool is_sqrt;
std::cin >> is_sqrt;
for(auto &i : vector)
{
    do_smth_1(i);
    //...
    do_smth_n(i);
    if(is_sqrt)
        std::cout << std::sqrt(i);
    else
        std::cout << i * i;
    do_smth(i);
}

很明显,您可以通过在 else 中编写替代条件来将条件移出循环:

if(is_sqrt) for(auto &i : vector)
{
    do_smth_1(i);
    //...
    do_smth_n(i);
    std::cout << std::sqrt(i);
    do_smth(i);
}
else for(auto &i : vector)
{
    do_smth_1(i);
    //...
    do_smth_n(i);
    std::cout << i * i;
    do_smth(i);
}

一段时间后,代码会增长并开始出现错误,因为需要复制代码(而且复制本身的事实也同样令人困惑)。我看到使用 std::function/*function 作为解决方案,但显然这两种方法在性能方面都比代码重复更糟糕。事实上,我真的不需要这种速度差异,这个问题只是有趣而已。 如果c++中没有解决这种情况的方法,也许有人在其他语言中见过它?看到会很有趣。

c++
1个回答
0
投票

您可以创建一个指向您要调用的函数的函数指针:

double sqrt(double x) {
    return std::sqrt(x);
}

double square(double x) {
    return x * x;
}
bool is_sqrt;
std::cin >> is_sqrt;

auto func = is_sqrt ? sqrt : square; // select function

for (auto &i : vector) {
    do_smth_1(i);
    //...
    do_smth_n(i);
    std::cout << func(i); // call the function
    do_smth(i);
}
© www.soinside.com 2019 - 2024. All rights reserved.