c++ - 使用模板将相同的方法应用于许多参数
问题描述
我正在尝试创建一个模板函数,该函数允许我将相同的方法应用于不同的对象,同时旨在最大限度地减少行数。这或多或少是我正在尝试做的事情:
#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<list>
using namespace std;
template<typename ...Args>
void clear_all(Args&... args) {
args.clear()...;
}
int main() {
vector<int> a = {1, 2, 3};
set<int> b = {4, 5, 6};
list<int> c = {7, 8, 9};
map<int, int> d = {{10, 11}, {12, 13}, {14, 15}};
clear_all(a, b, c, d);
}
万一不够清楚,这个函数clear_all
要基本相当于
a.clear();
b.clear();
c.clear();
d.clear();
我知道我可以尝试:
template <typename T>
void clear_all(T& t) {
t.clear();
}
template <typename T, typename ...Args>
void clear_all(T& t, Args&... args) {
clear_all(t);
clear_all(args...);
}
但那些行可能太多了;)有什么想法吗?
解决方案
使用折叠表达式(C++17 起):
template<typename ...Args>
void clear_all(Args&... args) {
(args.clear(), ...);
}
这与您的递归解决方案之间的重要区别不是行数,而是这不依赖于递归这一事实。如果您调用clear_all(a,b,c,d)
,则实例化一个具有 4 个参数的函数,而不是像递归解决方案中那样具有不同数量的参数的 4 个函数。这意味着没有递归的编译器的工作量更少(尽管在运行时可能没有可测量的差异)。
推荐阅读
- c# - 立即按照请求的顺序处理异步结果
- swift - Core Data iOS10 + 中的 NSPersistentContainer 轻量级迁移
- r - Scrape R For Loop - 为 i 获取字母范围 A 到 Z
- vue.js - 理解 Vue 中的导出语句
- python - 从一个 Python 文件启动 multilpe 无限 Python 进程
- php - 将实时服务器连接到本地数据库
- maven - Maven模块架构问题
- java - 如何在调用 super 时简化这个数学运算?
- ruby-on-rails - 更改参数名称 FORM_WITH VS FORM_FOR
- rust - 如何在 Rust 中从另一个字符中减去一个字符?