#include <iostream>
#include <vector>
#include <initializer_list>

template<typename T>
std::vector<T> merge(std::initializer_list <std::vector<T>*> vecs)
{
	size_t size = 0;
	for(auto v : vecs) { size += v->size(); }
	std::vector<T> ret;
	ret.reserve(size);
	for(auto v : vecs) { ret.insert(ret.end(), v->begin(), v->end()); }
	return ret;
}

int main()
{
	std::vector<std::string> a = {"a", "b"};
	std::vector<std::string> b = {"c", "d"};
	std::vector<std::string> c = {"e", "f"};
	std::vector<std::string> d = {"g", "h"};

	std::vector<std::string> newVector = merge({&a, &b, &c, &d});

	for(auto &s : newVector)
		std::cout << s << " ";

	return 0;
}