C++中能否基于parameter pack声明对应的variable pack?
C++参数包对应变量包的实现方案
C++标准中没有名为variable pack的原生语法,但你需求的对参数包每个元素做单次预处理、再展开计算的效果完全可以实现,以下是两种常用的兼容方案:
方案1:折叠表达式结合泛型Lambda(C++17及以上适用,最简洁)
这个方案不需要额外依赖,每个参数的预处理逻辑只会执行一次,完全满足你提到的「高开销函数仅调用一次」的要求。
针对取成员变量的场景:
template<typename... Args> bool all(Args... args) { return (... && [](const auto& arg) { const auto& member_a = arg.a; return member_a.isValidState() && member_a.isStateStable(); }(args)); }
展开后每个args元素会传入lambda一次,member_a只会初始化一次,和你预想的写法效果完全一致。
针对高开销函数调用的场景:
template<typename... Args> bool all(Args... args) { return (... && [](const auto& arg) { // 每个arg仅调用一次returnCurrentOrLast const auto& a = arg.returnCurrentOrLast(true); return a.isValidState() && a.isStateStable(); }(args)); }
方案2:打包为Tuple实现可复用的变量集合(适用于预处理结果需要多次使用的场景)
如果你的预处理结果需要在后续逻辑中多次使用,可以把所有预处理结果存到std::tuple中,相当于你要的「变量包」:
#include <tuple> #include <utility> template<typename... Args> bool all(Args... args) { // 所有参数的returnCurrentOrLast结果一次性打包为tuple,每个函数仅调用一次 auto a_pack = std::forward_as_tuple(args.returnCurrentOrLast(true)...); // 用std::apply展开tuple做折叠计算 return std::apply([](auto&&... a) { return (... && (a.isValidState() && a.isStateStable())); }, a_pack); // 后续逻辑如果需要再次用到所有a的值,直接复用a_pack即可,不需要重复计算 }
注意:如果
returnCurrentOrLast返回的是临时值,需要把std::forward_as_tuple换成std::make_tuple存储副本,避免出现悬垂引用。
内容的提问来源于stack exchange,提问作者Allanqunzi
相关产品推荐
相关产品推荐

