C ++是否有一个现有的无操作函数或语法,需要带任意数量的参数? 用于遍历参数包

问题描述

是否存在和现有的函数(或语法),如:

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,{});
}

解决方法

不,没有这样的标准功能。我们需要确保包装中没有任何表达式具有void类型。而且由于函数参数的评估是不确定地相对于彼此排序的,因此用例变得更加利基,因为没有办法强制执行顺序,而即使我们不在乎,表达式的有序应用也足够了订单。

因此,对于C ++ 17,我将使用以下折叠表达式进行操作

( (do_side_effect<T>(args),void()),... );

,void()是为了确保包装中每件商品的类型都不会干扰逗号的折叠(因为operator,可重载)。然后使用逗号运算符,扩展该表达式。您自己几乎可以到达那里,但是失败了,因为您省略了逗号运算符。

,

您可以将折叠表达式(C ++ 17)与逗号运算符结合使用:

(do_side_effect<T>(args),...);

完整示例:https://godbolt.org/z/54GqTf