【发布时间】:2021-05-13 21:23:24
【问题描述】:
#include <iostream>
#include <utility>
template<std::size_t... items>
constexpr std::size_t count()
{
return std::index_sequence<items...>().size();
}
template<std::size_t... items>
constexpr std::size_t fold_mul()
{
if( count<items...>() == 0 )
{
return 1;
}
else
{
return (... * items);
}
}
int main()
{
std::cout << "Result: " << fold_mul<>() << "\n";
}
此代码应输出1,但会引发错误:
:19:28: 错误:操作符上的空扩展折叠*
19 |返回(... * 项);
我的问题是:为什么这不起作用,因为 fold_expression 显然在 else 部分中。
作为参考,此实现有效:
template<typename... Args>
constexpr std::size_t fold_mul();
template<std::size_t... j>
requires (count<j...>() > 0)
constexpr std::size_t fold_mul()
{
return (j * ...);
}
template<>
constexpr std::size_t fold_mul()
{
return 1;
}
【问题讨论】:
-
你知道吗,你可以简单地使用
sizeof...(Args)来获取Args的长度?
标签: c++ variadic-templates c++20 fold