首页 > 解决方案 > 使用模板将相同的方法应用于许多参数

问题描述

我正在尝试创建一个模板函数,该函数允许我将相同的方法应用于不同的对象,同时旨在最大限度地减少行数。这或多或少是我正在尝试做的事情:

#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++templates

解决方案


使用折叠表达式(C++17 起):

template<typename ...Args>
void clear_all(Args&... args) {
    (args.clear(), ...);
}

这与您的递归解决方案之间的重要区别不是行数,而是这不依赖于递归这一事实。如果您调用clear_all(a,b,c,d),则实例化一个具有 4 个参数的函数,而不是像递归解决方案中那样具有不同数量的参数的 4 个函数。这意味着没有递归的编译器的工作量更少(尽管在运行时可能没有可测量的差异)。


推荐阅读