gpt4 book ai didi

c++ - 递归模板元编程

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:19:04 25 4
gpt4 key购买 nike

为了计算阶乘,我可以使用:

template<int N> struct factorial { enum { value = N * factorial<N-1>::value }; };

template<> struct factorial<1> { enum { value = 1 }; }; //base Case

然后就可以像下面这样使用了

x=factorial<8>::value;

那么,是否有可能得到类似的递归模板

 unsigned Log2(unsigned n, unsigned p = 0) {
return (n <= 1) ? p : Log2(n / 2, p + 1);
}

我能想到的是:

template<int N,unsigned int P=0> struct Log2 
{ enum { value = Log2<N/2,P+1>::value }; };

但是不知道怎么设置一个base case。

 template<> struct Log2<0,???> { enum { value = ???? }; };

有什么想法吗?

最佳答案

你可以使用偏特化

template <unsigned p>
struct Log2<0, p> { enum { value = p }; };

template <unsigned p>
struct Log2<1, p> { enum { value = p }; };

在 C++11 中,您可以将函数转换为 constexpr 而不是创建模板。

constexpr unsigned Log2(unsigned n, unsigned p = 0) {
return (n <= 1) ? p : Log2(n / 2, p + 1);
}

std::array<int, Log2(256)> x {{1, 2, 3, 4, 5, 6, 7, 8}};
// ^^^^^^^^^ Just a compile-time function call.

关于c++ - 递归模板元编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18232647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com