C++模板递归超出深度

发布于 2022-09-02 16:02:08 字数 1192 浏览 11 评论 0

/**
 * Return the Kth digit of N with base M
 * e.g. digit<1024,3,10>() = 0
 * digit<54321,2,10>() = 2
 */
template<unsigned N, unsigned K, unsigned M>
constexpr unsigned digit() {
    return (K==1) ? (N%M) : (digit<N/M,K-1,M>());
}

int main() {
    printf("%u\n", digit<1024,3,10>());
    return 0;
}

想写一个编译时算某个数N第K位上的数是几的程序,模板应该在K=1时停下来,但是编译器报错了,请教应该如何改正?

clang++ -std=c++11 -Wall -o recursive_template recursive_template.cpp
recursive_template.cpp:10:27: fatal error: recursive template instantiation exceeded
      maximum depth of 256
        return (K==1) ? (N%M) : (digit<N/M,K-1,M>());
                                 ^

[2016-05-21]
感谢几位的回答!与这个写法类似的算一个数字有多少位的程序可以编译运行无误,我并不明白为何一个能编译过,一个不行,因为感觉上差不多。写在这里供大家参考~

/**
 * Return the number of digits when N is expressed in base M.
 * e.g. base_digits<0,10> == 1
 * base_digits<8,2> == 4
 */
template<unsigned N, unsigned M>
constexpr unsigned base_digits() {
    return (N<M)?1:(1+base_digits<N/M,M>());
}

int main() {
    printf("%u\n", base_digits<1024,2>());
    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清欢 2022-09-09 16:02:08

印象中应该不是这样用的

中止条件好像应该要用特例

你搜搜 模版特例化 看看

等待我真够勒 2022-09-09 16:02:08

同意楼上。要分清编译时和运行时的区别。你这么写在N为1时仍然会接着往下实例化模板

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文