Попробуйте это:
#include <tuple>
#include <unordered_map>
#include <iostream>
template <typename T>
void merge_map_helper (T& t1, T& t2) { }
template <typename T, std::size_t I, std::size_t ... Is>
void merge_map_helper (T& t1, T& t2) {
std::get<I>(t1).merge( std::get<I>(t2));
merge_map_helper<T, Is...>(t1, t2);
}
template <typename ... Ts, std::size_t ... Is>
void merge_map (std::tuple<Ts...>& t1, std::tuple<Ts...> & t2, std::index_sequence<Is...> const &) {
merge_map_helper<std::tuple<Ts...>, Is...>(t1, t2);
}
template <class ...Ts>
struct MyContainer
{
std::tuple<Ts...> data;
MyContainer(std::tuple<Ts...> data) : data(std::move(data)) { }
void merge(MyContainer<Ts...>& other){
merge_map(data, other.data, std::make_index_sequence<sizeof...(Ts)>{});
}
};
int main()
{
using namespace std;
unordered_map<string, int> f1 = {{"zero1", 0}, {"one", 1}};
unordered_map<string, int> f2 = {{"zero2", 0}, {"one", 1}};
MyContainer <unordered_map<string, int>, unordered_map<string, int>> container1 =
{ { f1, f2 } };
unordered_map<string, int> s1 = {{"two1", 2}, {"three", 3}};
unordered_map<string, int> s2 = {{"two2", 2}, {"three", 3}};
MyContainer <unordered_map<string, int>, unordered_map<string, int>> container2 =
{ { s1, s2} };
container1.merge(container2);
for(auto & k :std::get<0>(container1.data)) {
std::cout << k.first << " " << k.second << "\n";
}
for(auto & k :std::get<1>(container1.data)) {
std::cout << k.first << " " << k.second << "\n";
}
}
Обратите внимание, что merge_map
не возвращает карту, она изменяет первую. Поэтому я обновил аргументы и возвращаю значения, чтобы отразить это.