【发布时间】:2012-09-02 15:18:51
【问题描述】:
考虑以下用于积分 pow 的元函数(这只是一个示例):
class Meta
{
template<int N, typename T> static constexpr T ipow(T x)
{
return (N > 0) ? (x*ipow<N-1>(x))
: ((N < 0) ? (static_cast<T>(1)/ipow<N>(x))
: (1))
}
};
这样的函数的停止条件怎么写?
【问题讨论】:
-
@n.m.请发布解决方案您将如何重载该 ipow 函数模板,我已经完成了我的头:D
-
有一个讨厌的黑客,我想你可以做
return (N > 0) ? (x * ipow<(N - 1) * (N > 0)>(x)) : ((N < 0) ? (static_cast<T>(1)/ipow<-N * (N < 0)>(x)) : (1));。实在是太恶心了,不推荐。 -
@Mr.Anubis:JohannesSchaub-litb 打败了我,看看他的回答。
-
@JohannesSchaub-litb :为什么原始版本会导致无限递归而不是您讨厌的 hack(效果很好,我测试过,但我不明白为什么)?
-
@Vincent 因为我讨厌的 hack 使用
<0>作为错误分支中的参数,而不是不断递减的数字。如果您在 0,则原始版本将实例化为 -1、-2、... 而不结束。即使分支的条件是编译时间常数(如您的情况),当前的(C++11)语言也不会阻止这种递归。
标签: c++ templates c++11 metaprogramming partial-specialization