У меня есть вектор строк, каждая из которых является результатом применения std :: to_string к некоторому базовому типу данных (например, char, int, double). Я хотел бы функцию, чтобы отменить это в кортеж соответствующих типов.
У меня есть простой шаблон функции для инвертирования std :: to_string:
template<typename T>
T from_string(std::string s)
{
}
template<>
int from_string<int>(std::string s)
{
return std::stoi(s);
}
template<>
double from_string<double>(std::string s)
{
return std::stod(s);
}
//... and more such specializations for the other basic types
Я хочу такую функцию, как:
template<typename... Ts>
std::tuple<Ts> undo(const std::vector<std::string>>& vec_of_str)
{
// somehow call the appropriate specializations of from_string to the elements of vector_of_str and pack the results in a tuple. then return the tuple.
}
Функция должна вести себя так:
int main()
{
auto ss = std::vector<std::string>>({"4", "0.5"});
auto tuple1 = undo<int, double>(ss);
std::tuple<int, double> tuple2(4, 0.5);
// tuple1 and tuple2 should be identical.
}
Я думаю, что мне нужно «перебрать» параметры в Ts (возможно, правильным термином является «unpack»), вызвать предыдущую функцию from_string для каждого и затем упаковать результаты каждого приложения from_string в кортеж. Я видел (и использовал) примеры, которые распаковывают пакет параметров шаблона - они обычно рекурсивны (но не обычным способом вызова самой функции), но я не вижу, как сделать остальное.