C++如何使用可变参数模板遍历类型批量实例化类调用成员方法
解答
完全支持,借助C可变参数模板即可实现传入多个类型、逐个实例化调用process方法的需求,不同C标准对应不同实现方式:
C++11/14 兼容实现
C++11/14没有专门的参数包折叠语法,可以借助初始化列表展开参数包,利用初始化列表固定从左到右的求值顺序保证执行顺序符合预期:
#include <iostream> template<class... Ps> void processAll() { // 逗号表达式先执行process调用,再返回0填充初始化数组 int unpack[] = {0, (Ps().process(), 0)...}; (void)unpack; // 屏蔽未使用局部变量的编译警告 } class P1 { public: void process() { std::cout << "process1" << std::endl; } }; class P2 { public: void process() { std::cout << "process2" << std::endl; } }; int main() { processAll<P1, P2>(); // 按顺序输出process1、process2 return 0; }
代码里直接构造Ps类型的临时对象调用process,和原代码中先实例化局部对象再调用的效果完全一致。
C++17 简化实现
C++17引入了折叠表达式特性,可以把实现简化到一行,不需要额外的辅助数组:
template<class... Ps> void processAll() { (Ps().process(), ...); }
这种写法属于逗号折叠,会自动按模板参数传入顺序展开执行每个类型的process调用,逻辑和C++11版本完全一致。
注意事项
- 所有传入的类型必须满足原单参数版本的约束:拥有公有无参构造函数、存在公有的
process()成员方法,否则会编译报错。 - 两种实现的执行顺序都严格匹配模板参数的传入顺序,不会出现乱序执行的问题。
内容的提问来源于stack exchange,提问作者Dbi
相关产品推荐
相关产品推荐

