c – 递归模板元编程

前端之家收集整理的这篇文章主要介绍了c – 递归模板元编程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为了计算阶乘,我可以使用:
template<int N> struct factorial { enum { value = N * factorial<N-1>::value }; };

template<> struct factorial<1> { enum { value = 1 }; }; //base Case
@H_301_4@然后可以像下面一样使用它

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

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

unsigned Log2(unsigned n,unsigned p = 0) {
    return (n <= 1) ? p : Log2(n / 2,p + 1);
}
@H_301_4@我能想到这个:

template<int N,unsigned int P=0> struct Log2 
    { enum { value = Log2<N/2,P+1>::value }; };
@H_301_4@但不知道如何设置基础案例.

template<> struct Log2<0,???> { enum { value = ???? }; };
@H_301_4@有任何想法吗 ?

解决方法

你可以使用部分专业化
template <unsigned p>
struct Log2<0,p> { enum { value = p }; };

template <unsigned p>
struct Log2<1,p> { enum { value = p }; };
@H_301_4@在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.
原文链接:https://www.f2er.com/c/111066.html

猜你在找的C&C++相关文章