编译期循环执行的代码

使用模板元编程进行递归编写,来实现编译期代码循环执行

例:给定一个无符号整数(unsigned int),求该整数对应的二进制数中有几个1

#include <iostream>

template <size_t input>
constexpr size_t onesCount = (input % 2) + onesCount<(input / 2)>;

template <>
constexpr size_t onesCount<0> = 0;

int main() {
    constexpr size_t res = onesCount<45>;
    std::cout << res << std::endl;
}

也可以使用这种写法结合变参模板来处理数组

如下数组求和的程序

#include <iostream>

template <size_t...input>
constexpr size_t accumulate = 0;

template <size_t cur_input, size_t...input>
constexpr size_t accumulate<cur_input, input...> = cur_input + accumulate<input...>;

int main() {
    constexpr size_t res = accumulate<1, 2, 3, 4, 5>;
    std::cout << res << std::endl;
}

当模板参数个数大于0时,都会执行特化的模板,当模板参数为空时,执行上面的模板返回0,结束递归

posted @ 2024-02-19 22:37  Wangtn  阅读(14)  评论(0编辑  收藏  举报