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

template<typename T>
std::vector<T> merge(std::initializer_list <std::reference_wrapper<const std::vector<T>>> vecs)
{
	size_t size = 0;
	for(auto &v : vecs) { size += v.get().size(); }
	std::vector<T> ret;
	ret.reserve(size);
	for(auto &v : vecs) { ret.insert(ret.end(), v.get().begin(), v.get().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({std::cref(a), std::cref(b), std::cref(c), std::cref(d)});

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

	return 0;
}