C++可变参数遍历:确保按序触发调用且避免优化消除
问题:确保按顺序触发所有传入函数的调用,避免编译器优化移除调用
核心需求:保证代码触发每个参数对应的函数调用,所有作为输入传入的函数都被执行,最担心编译器优化会移除部分调用,导致结果异常。
已尝试的方案及问题
方案1:参数逆序执行
使用如下模板函数可以触发函数调用,但存在参数逆序触发的问题——最后一个参数先被调用,第一个参数最后被调用:
template <typename... PARMS> uint PARMS_COUNT(PARMS&& ... parms) { return static_cast<uint>( sizeof...(parms) ); }
方案2:递归实现仍无法解决顺序问题
最初尝试了递归的替代实现,后来发现参数求值顺序由函数参数评估规则决定,而非函数使用参数的顺序,所以还是无法改变调用顺序:
template <typename FIRST> constexpr uint PARMS_EXPAND(FIRST &&first) { return static_cast<uint>( sizeof(first) > 0 ? 1 : 0 ); } template <typename FIRST,typename... PARMS> constexpr uint PARMS_EXPAND(FIRST &&first,PARMS&& ... parms) { return static_cast<uint>( sizeof(first) > 0 ? 1 : 0 ) + PARMS_EXPAND( std::forward<PARMS>(parms)... ); }
应用场景示例
以批量向父对象添加新对象为例:
void AddObject(/*单个未知输入参数*/) { // 添加对象的逻辑 ... } template <typename... PARMS> void AddObjects(PARMS&& ... parms) { PARAMS_EXPAND( AddObject(parms)... ); }
疑问
已进行少量测试,但始终不确定现有实现是否安全。请问是否存在标准或公认的实现方法?或是有内置机制可按正确顺序遍历并访问参数?
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

