首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归模板元编程

递归模板元编程
EN

Stack Overflow用户
提问于 2013-08-14 13:09:38
回答 1查看 3K关注 0票数 6

对于计算阶乘,我可以使用:

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
 unsigned Log2(unsigned n, unsigned p = 0) {
    return (n <= 1) ? p : Log2(n / 2, p + 1);
}

我可以这样想:

代码语言:javascript
复制
template<int N,unsigned int P=0> struct Log2 
    { enum { value = Log2<N/2,P+1>::value }; };

但不知道如何设置一个基本的案子。

代码语言:javascript
复制
 template<> struct Log2<0,???> { enum { value = ???? }; };

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-14 13:11:09

可以使用部分专门化。

代码语言:javascript
复制
template <unsigned p>
struct Log2<0, p> { enum { value = p }; };

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

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

代码语言:javascript
复制
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.
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18232647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档