C++ 是否存在接受任意数量参数的现有无操作函数(或语法)? (用于遍历参数包)
C++ is there an existing no-op function (or syntax) that takes any number of arguments? (for iterating over a parameter pack)
是否存在像这样的函数(或语法):
inline void noop(...) { /* EMPTY */ }
所以我可以做这样的事情:
template <class... T>
void foo(T... args) {
noop( do_side_effect<T>(args)... );
}
------------编辑----------
因为这样的东西无法编译:
template <class... T>
void foo(T... args) {
do_side_effect<T>(args)...;
}
template <class... T>
void foo(T... args) {
( do_side_effect<T>(args)... );
}
------------ 编辑 2 ----------
显示可能用例的示例。
template <class T, class F, int... indices>
void _tuple_foreach_details(T&& tuple, F& functor, std::index_sequence<indices...>){
noop( functor(std::get<indices>(tuple))... );
/* this means:
functor(std::get<0>(tuple));
functor(std::get<1>(tuple));
...
functor(std::get<N>(tuple));
*/
}
template <class T, class F>
void tuple_foreach(T&& tuple, F& functor) {
_tuple_foreach_details<T, F, std::make_index_sequence<std::tuple_size_v<T>>>(tuple, functor, {});
}
您可以使用 折叠表达式 (C++17) 结合逗号运算符:
(do_side_effect<T>(args) , ...);
不,没有这样的标准函数。我们需要确保从包中出来的表达式都没有 void
类型。而且由于函数参数的求值相对于彼此的顺序是不确定的,用例变得更加小众,因为没有办法强制执行顺序,而表达式的有序应用就足够了,即使我们不关心订单。
所以对于 C++17,我将使用折叠表达式来完成,如下所示
( (do_side_effect<T>(args), void()), ... );
, void()
是为了确保包中每个项目的类型不会干扰逗号上的折叠(因为 operator,
是可重载的)。然后用逗号运算符 ,
扩展该表达式。你自己差一点就到了,但失败了,因为你省略了 comma-operator.
是否存在像这样的函数(或语法):
inline void noop(...) { /* EMPTY */ }
所以我可以做这样的事情:
template <class... T>
void foo(T... args) {
noop( do_side_effect<T>(args)... );
}
------------编辑----------
因为这样的东西无法编译:
template <class... T>
void foo(T... args) {
do_side_effect<T>(args)...;
}
template <class... T>
void foo(T... args) {
( do_side_effect<T>(args)... );
}
------------ 编辑 2 ----------
显示可能用例的示例。
template <class T, class F, int... indices>
void _tuple_foreach_details(T&& tuple, F& functor, std::index_sequence<indices...>){
noop( functor(std::get<indices>(tuple))... );
/* this means:
functor(std::get<0>(tuple));
functor(std::get<1>(tuple));
...
functor(std::get<N>(tuple));
*/
}
template <class T, class F>
void tuple_foreach(T&& tuple, F& functor) {
_tuple_foreach_details<T, F, std::make_index_sequence<std::tuple_size_v<T>>>(tuple, functor, {});
}
您可以使用 折叠表达式 (C++17) 结合逗号运算符:
(do_side_effect<T>(args) , ...);
不,没有这样的标准函数。我们需要确保从包中出来的表达式都没有 void
类型。而且由于函数参数的求值相对于彼此的顺序是不确定的,用例变得更加小众,因为没有办法强制执行顺序,而表达式的有序应用就足够了,即使我们不关心订单。
所以对于 C++17,我将使用折叠表达式来完成,如下所示
( (do_side_effect<T>(args), void()), ... );
, void()
是为了确保包中每个项目的类型不会干扰逗号上的折叠(因为 operator,
是可重载的)。然后用逗号运算符 ,
扩展该表达式。你自己差一点就到了,但失败了,因为你省略了 comma-operator.