使用折叠表达式填充数组时的语法问题
Syntax issue when populating an array with a fold expression
是的,我可以使用 std::initializer_list
。是的,更简单的是,我可以进行聚合初始化。但这是如何工作的呢?我似乎无法理解 C++17 的折叠表达式。没有足够的例子。
这是我想出的:
template<class T, std::size_t N>
struct foo
{
T arr[N];
template<typename... Args>
constexpr foo(Args&&... pack)
{
static_assert(sizeof...(pack) <= N, "Too many args");
std::size_t i = 0;
(arr[i++] = ...);
}
};
int main()
{
foo<int, 5> a(1, 2, 3, 4, 5);
}
编辑: 使用最新的 Clang 进行编译。支持折叠表达式。
需要用逗号进行折叠,这样也解决了顺序问题
(void(arr[i++] = pack) , ...);
由于逗号运算符是 left-associative,您最好使用左一元折叠:
(...,void(arr[i++] = pack))
转换为 void
是为了确保使用 built-in 逗号运算符。在这种情况下,用手习惯实际上并不重要。
是的,我可以使用 std::initializer_list
。是的,更简单的是,我可以进行聚合初始化。但这是如何工作的呢?我似乎无法理解 C++17 的折叠表达式。没有足够的例子。
这是我想出的:
template<class T, std::size_t N>
struct foo
{
T arr[N];
template<typename... Args>
constexpr foo(Args&&... pack)
{
static_assert(sizeof...(pack) <= N, "Too many args");
std::size_t i = 0;
(arr[i++] = ...);
}
};
int main()
{
foo<int, 5> a(1, 2, 3, 4, 5);
}
编辑: 使用最新的 Clang 进行编译。支持折叠表达式。
需要用逗号进行折叠,这样也解决了顺序问题
(void(arr[i++] = pack) , ...);
由于逗号运算符是 left-associative,您最好使用左一元折叠:
(...,void(arr[i++] = pack))
转换为 void
是为了确保使用 built-in 逗号运算符。在这种情况下,用手习惯实际上并不重要。