在const表达式中重用函数逻辑

时间:2010-06-29 17:20:11

标签: c++

我认为我的问题是,无论如何要模仿我们将从当前C ++标准的C ++ 0x constexpr关键字中获得的行为(即如果我理解constexpr是什么应该做得正确)。

更清楚的是,有时候在编译时计算一个值是有用的,但是也可以在运行时计算它,例如,如果我们想要计算权力,我们可以使用下面的代码。

template<int X, unsigned int Y>
struct xPowerY_const {
    static const int value = X*xPowerY_const<X,Y-1>::value;
};

template<int X>
struct xPowerY_const<X, 1> {
    static const int value = X;
};

int xPowerY(int x, unsigned int y) {
    return (y==1) ? x : x*xPowerY(x,y-1);
}

这是一个简单的例子,但在更复杂的情况下,能够重用代码会很有帮助。即使对于运行时性能,函数的递归性质是次优的并且可以设计出更好的算法,如果模板化版本可以在函数中表示,那么测试逻辑将是有用的,因为我看不到合理的方法在广泛的情况下测试常量模板方法的有效性(虽然可能有一个,我只是看不到它,也许这是另一个问题)。

感谢。

修改 忘了提,我不想#define

Edit2 此外我的代码错误,它不处理x ^ 0,但这不会影响问题。

1 个答案:

答案 0 :(得分:4)

模板元编程以与“普通”C ++代码完全不同(且不兼容)的方式实现逻辑。你没有定义一个函数,你正在定义一个类型。只是类型具有与之关联的值,它是由其他类型的组合构建的。

因为模板定义了类型,所以不涉及程序逻辑。逻辑只是编译器尝试解决模板化类型之间关系的副作用。实际上没有任何方法可以自动从模板“程序”中将高级逻辑提取到函数中。

FWIW,模板首次实施模板时,模板元编程甚至不是Bjarne眼中的一线。它们实际上是在语言的生命中被语言的用户发现。这是类型系统的“无意识的”副作用,恰好变得非常受欢迎。正是由于这一发现,新功能被添加到语言中,以更全面地支持已经发展的习语。