C++函数式编程:如何对多个vector批量调用clear()?
一行代码批量调用多个对象的成员函数
假设有若干vector<int>对象v1、v2、v3,目前需要逐个调用它们的clear()方法:
#include <vector> std::vector<int> v1; std::vector<int> v2; std::vector<int> v3; v1.clear(); v2.clear(); v3.clear();
能不能用一行代码实现批量调用?期望的实现形式类似:
someHOF(clear(), ls[v1, v2, v3]);
当然可以,下面给你几种实用的实现方式:
1. 自定义可变参数模板函数(最贴近你的期望形式)
自己实现一个高阶函数,接收成员函数指针和多个对象,批量调用:
#include <vector> #include <utility> // 自定义的someHOF,命名为apply更直观 template<typename MemFunc, typename... Objects> void apply(MemFunc func, Objects&&... objs) { // C++17折叠表达式展开参数包,逐个调用成员函数 ( (std::forward<Objects>(objs).*func)(), ... ); } int main() { std::vector<int> v1, v2, v3; // 调用方式完全符合你的需求逻辑 apply(&std::vector<int>::clear, v1, v2, v3); }
2. 用std::for_each+初始化列表快速实现
不需要写模板函数,用标准库工具就能搞定:
#include <vector> #include <algorithm> int main() { std::vector<int> v1, v2, v3; // 用指针初始化列表避免拷贝vector,效率更高 std::for_each({&v1, &v2, &v3}, [](auto vec_ptr) { vec_ptr->clear(); }); }
3. C++20及以上的简化写法
如果你的编译器支持C++20,还可以用范围for直接遍历引用的初始化列表:
#include <vector> #include <functional> // for std::ref int main() { std::vector<int> v1, v2, v3; for (auto& vec : {std::ref(v1), std::ref(v2), std::ref(v3)}) { vec.clear(); } }
内容的提问来源于stack exchange,提问作者Gera
相关产品推荐
相关产品推荐

