Рефакторинг константного выражения if в функции шаблона - PullRequest
0 голосов
/ 10 июля 2019

Я бы хотел рефакторинг следующего кода:

enum Mode { None, Value1, Value2 }
template <Mode mode>
bool func() {
    if (mode == None) {
        helperNone();
        return funcImplNone();
    } else if (mode == Value1) {
        helper1();
        return funcImplValue1();
    } else if (mode == Value2) {
        helper2(); 
        return funcImplValue2();
    }
    return true;
}

, потому что выражение

mode == None 

вычисляется во время компиляции.И также не может ли этот код привести к раздуванию кода (дублирование кода в исполняемом файле)?

Я думаю о следующем рефакторинге:

template<Mode>
bool func() {
    return true;
}

template<>
bool func<None>() {
    return true;
}

template<>
bool func<Value1>() {
    helper1();
    return funcImplValue2();
}

template<>
bool func<Value2>() {
    helper2();
    return funcImplValue2();
}

Существуют ли другие стандарты?способ рефакторинга что?Есть ли у нас гарантии, что компилятор оптимизирует сам этот код?Не выглядит ли измененный код более четким?

1 Ответ

1 голос
/ 10 июля 2019

Рефакторинг здесь не имеет большого смысла, так как в любом случае он оптимизируется. Например, следующий код производит только один вызов funcImpl ();

enum Mode { None, Other };

bool funcImpl();

template <Mode mode>
bool func() {
    if (mode != None)
        return funcImpl();
    return true;
}

void test()
{
    volatile auto a = func<None>();
    a = func<Other>();
}

Результат

test():
    sub     rsp, 24
    mov     BYTE PTR [rsp+15], 1
    call    funcImpl()
    mov     BYTE PTR [rsp+15], al
    add     rsp, 24
    ret

https://godbolt.org/z/V5Uxig

...