Я пытался понять это некоторое время, и я просто не могу этого сделать.
Что я хотел бы сделать, так это создать функцию шаблона, для которой требуется любое количество аргументов параметра char, а затем один std::string в качестве параметра. Синтаксис примера будет выглядеть так:
nvec<3, std::string> info = string_to_vec<':', ';', '-'>(data);
nvec — это рекурсивный класс шаблонов, который создает n-мерный вектор, основанный на шаблоне определенного типа. Его код довольно прост и его можно увидеть здесь:
template <size_t dim, typename T>
struct multidimensional_vector
{
typedef std::vector<typename multidimensional_vector<dim - 1, T>::type> type;
};
template <typename T>
struct multidimensional_vector<0, T>
{
typedef T type;
};
template <size_t dim, typename T>
using nvec = typename multidimensional_vector<dim, typename T>::type;
Однако для string_to_vec может потребоваться любое количество символьных параметров (но не менее одного). Затем с этой информацией нужно вернуть соответствующий n-мерный вектор строки с данными, вставленными как разделенные этими символами. Например, предположим, что std::string, который я передаю, выглядит так:
std::string data = "1:2:3;4:5:6;7:8:9-10:11:12;13:14:15;16:17:18"
Тогда я ожидал бы, что эта функция вернет n-мерный вектор (шаблон строки типа), к которому можно получить доступ следующим образом:
info[0][0][0] // = 1
info[1][0][0] // = 10
info[1][1][1] // = 14
info[1][2][2] // = 18
// etc.
Хотя это нетрудно сделать, если размер вектора известен заранее (просто используйте много циклов for), это становится очень сложно, когда данные содержат произвольное количество разделителей (это означает, что вектор может быть любым). измерение). Возможно ли это сделать с рекурсивными вариативными шаблонами? Если да, то я, честно говоря, понятия не имею, с чего начать.