2013-10-02 36 views
0

以下模板转乘FUNC <7>(42)和FUNC(42,7)模板参数语法

template<typename Data, typename Number> 
int compute(Data d, Number n) { 
    if(n > 10) SLOW(d) 
    if(n < 30) EXPENSIVE(d) 
    if(n < -10) .. if(..) // etc. 
    return d.abc(); 
} 

有时也被称为具有动态计算Number ncompute(data, runtime_number), 和有时与编译时已知参数: compute(data, 3)

如果我不相信编译器优化后一种情况(有或没有内联),但相信它足以使if(false)块消失,我将不得不复制大量代码并编写compute<12>(data)模板。除了代码重复之外,compute(data, number)只是更好,更直观。

有没有办法统一这两个?

编辑:这更多的是模板,或模板滥用,如果你会,比对优化编译器可以适用于这种情况。

+2

我看到它的方式,在这里没有太多的优化。在最糟糕的情况下,你会得到一些额外的常量比较(每个循环1次),也可能是一个或两个分支。由于您提到函数“SLOW”和“EXPENSIVE”被调用取决于结果,这些优化根本没有任何区别。 – us2012

+0

对,这些功能较少,更多关于从代码中移除if()...块。除了轻量级比较函数外,还有分支预测失误的代价:有很多'if'子句(没有'else'!),并且这个函数经常被调用。 – toting

+0

如果SLOW和EXPENSIVE是纯函数,也许可以缓存结果。 – jcarpenter2

回答

1

什么都不做。编译器足够优化所有东西。