调用常用方法/将常用函数应用于具有不同类型对象的不同容器

时间:2016-02-09 17:29:15

标签: c++ c++11 containers

我在C ++中有几个不同类型的对象和各种类型的容器的集合。我需要在此集合中执行一些常见操作,例如,清理容器并调整其大小。有没有办法写一个简短的代码?例如,请考虑以下代码:

#include <vector>
#include <unordered_map>

using namespace std;

class A {};
class B {};
class C {};

int main() {
    vector<A> a;
    vector<B> b;
    vector<C> c;
    unordered_map<int, int> map;

    // I would like something like this...
    for(auto& ct : {a, b, c, map}) {
        ct.clear();
        ct.reserve(1000);
    }

    return 0;
}

当然,上面的代码在C ++ 11上是无效的,因为编译器无法推断出列表。我有或多或少十个容器,但这些数字可以上升。因此,代码必须等效(大小)才能将操作分别应用于这些容器。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

您可以实现像apply这样的函数,其第一个参数采用泛型操作(例如泛型 lambda),其余参数是您要在其上应用的对象操作:

apply
(
   [](auto && c) { c.clear(); c.reserve(100); },  //use: -std=c++14
   a,
   b,
   c,
   map
);

以下是一种可能的实施方式:

template<typename Op, typename ... Cs>
void apply(Op op, Cs && ... args)
{
   using unpack = int[];
   unpack {0, ( op(std::forward<Cs>(args)), void(), 0 ) ... };
}

希望有所帮助。

答案 1 :(得分:0)

在这种情况下,提升任何可能都有用: http://www.boost.org/doc/libs/1_60_0/doc/html/any/s02.html