C++优雅的方式合并开关与if和变量赋值[关闭]

ff29svar  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(106)

3天前关闭。
Improve this question
我的代码如下所示

enum possible_cases; //assigned somewhere
bool decision; //assigned somewhere

//basically the default action for my possible_cases
int value = 10;
do_something(value);

switch (possible_cases)
{
    case 0:
        //assume covered by do_something(value)
        break;
    case 1:
        if ( decision )
        {
            value = get_other_value();
            do_something(value);
        }
        break;
    case 2:
        value = get_other_value(); //will return same value as in case 1
        do_something(value);
        break;
}

如你所见
1.它必须使用一个特定值运行do_something()
1.它可能必须使用其他值运行do_something()另外,并且情况列表可能会增长到使用bool不切实际的程度
但总的来说,我并不高兴,因为这有点多余,我认为有办法做得更好。
我想继续列举案例
编辑:
问题出在哪里似乎还不清楚:
我在3个地方看到了相同函数的调用,而我假设我可以将其减少到2,因为我知道我最多只需要运行它2次。

q9rjltbz

q9rjltbz1#

代码中的冗余部分是do_something(value),因此我建议您将这部分代码分离出来

enum possible_cases; //assigned somewhere
bool decision; //assigned somewhere

//basically the default action for my possible_cases
int value = 10;

switch (possible_cases)
{
    case 1:
        if ( decision )
            value = get_other_value();
        break;
    case 2:
        value = get_other_value(); //will return same value as in case 1
        break;
}
do_something(value);
js81xvg6

js81xvg62#

通过添加额外的图层,您可以执行以下操作:

std::optional<int>
get_additionnal_value(Epossible_cases possible_cases, bool decision)
{
    //basically the default action for my possible_cases
    const int value = 10;
    
    switch (possible_cases)
    {
    default:
    case 0: return std::nullopt;
#if 1
    case 1: return decision ? get_other_value() : value;
#else
    case 1: if (!decision) return value;
            [[fallthrough]];
#endif
    case 2: return get_other_value(); //will return same value as in case 1
    }
}

然后

do_something(10);
if (auto opt_value = get_additionnal_value(possible_cases, decision)) {
    do_something(opt_value);
}

相关问题