Судя по вашему вопросу, ваше требование состоит в том, чтобы просто иметь возможность express тип
tuple<vector<int>, vector<string>, vector<double>>
как
vertices<tuple<int, string, double>>
Это может быть достигнуто с помощью переменного шаблона , Все, что нам нужно, это взять тип (это кортеж) и распаковать этот кортеж в вектор. Поскольку тип не является пакетом variadi c, нам необходим другой уровень косвенности для получения типов в кортеже. Ответ @ NathanOliver показывает хороший способ сделать это, используя объявление функции-шаблона. Как уже указывалось, поскольку все, что нам нужно, - это преобразования типов, функция не нуждается в определении, объявление говорит само за себя: тип аргумента - это тип ввода, а тип возврата - тип вывода.
template <typename... Types>
auto unpack(tuple<Types...>) -> tuple<vector<Types>...> ;
template <typename Tuple>
using vertices = decltype(unpack(declval<Tuple>()));
static_assert(std::is_same<
vertices<tuple<int, string, double>>,
tuple<vector<int>, vector<string>, vector<double>>>{});