You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:30:52