加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 递归模板元编程

发布时间:2020-12-16 03:34:39 所属栏目:百科 来源:网络整理
导读:为了计算阶乘,我可以使用: templateint N struct factorial { enum { value = N * factorialN-1::value }; };template struct factorial1 { enum { value = 1 }; }; //base Case 然后可以像下面一样使用它 X =阶乘LT 8是氢; ::值; 那么,是否有可能获得类似
为了计算阶乘,我可以使用:
template<int N> struct factorial { enum { value = N * factorial<N-1>::value }; };

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

然后可以像下面一样使用它

X =&阶乘LT 8是氢; ::值;

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

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 }; };

但不知道如何设置基础案例.

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,p + 1);
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读