在模板函数中

时间:2019-07-10 14:12:07

标签: c++ templates c++14

我想重构以下代码:

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 个答案:

答案 0 :(得分:1)

这里的重构毫无意义,因为无论如何它都在进行优化。 例如,以下代码仅对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