在 中fmt/core.h,我注意到该函数使用带有给定谓词的count_named_args()模板函数。count
我发现版本的重载版本count很奇怪:
template <bool B1, bool B2, bool... Tail> constexpr auto count() -> size_t {
return (B1 ? 1 : 0) + count<B2, Tail...>();
}
Run Code Online (Sandbox Code Playgroud)
为什么我们需要使用模板参数bool B2来显式提取下一个布尔值,而不是直接使用参数包bool... Tail?
如果我删除这些bool B2内容,然后尝试编译:
template <bool B1, bool... Tail> constexpr auto count() -> size_t {
return (B1 ? 1 : 0) + count<Tail...>();
}
Run Code Online (Sandbox Code Playgroud)
static_assert(count<false>() == 0);
static_assert(count<true, false>() == 1);
Run Code Online (Sandbox Code Playgroud)
当参数数量减少到最后一个时,它会给出一个错误,因为确定重载是不明确的:
size_t count<false,>(void) noexcept
size_t count<false>(void) noexcept
Run Code Online (Sandbox Code Playgroud)