Я пытаюсь понять технику создание рекурсивной структуры данных с использованием TMP с этим вопросом.Как создать рекурсивные структуры данных для вариативных шаблонов?
Вопрос
Пусть у меня есть VARIADIC шаблонtemplate<typename... Ts> struct my_sets { };
.
В my_sets
Я хотел бы сгенерировать новый тип, данные которого зависят от Ts
.
Например, я хочу my_sets
иметь одного члена std::set<T>
данных для каждого элемента/типа, который находится в Ts...
using x_t = my_sets<int,char,std::string>;
x_t x;
x.insert<0>( 5 ); // into a std::set<int> member in my_sets<>
x.insert<1>( 'z' ); // into a std::set<char> member in my_sets<>
x.insert<2>("foo"); // into a std::set<std::string> member in my_sets<>
Я думаю, что один из способов достижения этого может быть за счет использования подклассов и рекурсии, но я не уверен.
FWIW, если оно более прямолинейно реализовать мутатор через свободную функцию или обычной перегрузки функций, это нормально, тоже:
insert<0>(x, 5 ); // into a std::set<int> member in my_sets<>
insert<1>(x, 'z' ); // into a std::set<char> member in my_sets<>
insert<2>(x, "foo"); // into a std::set<std::string> member in my_sets<>
+1 v.nice - не знал, что вы можете * разорвать * на ... вот так, но когда я смотрел на него какое-то время, синтаксис на самом деле имеет смысл! – kfmfe04
@ kfmfe04: Расширение пакета просто говорит «вот этот шаблон, копия и замена для всего, что есть в пакете». – Xeo
Я видел типичное расширение «Ts ...» - это был «std :: set ...», который действительно меня удивил! Я бы поспорил, что разработчикам компилятора было нетривиально, чтобы этот фрагмент кода работал на синтаксическом разборе и работал правильно. Но теперь, когда я смотрю на пример Энди ниже, я не совсем уверен, что понимаю его использование - он делает целую кучу отдельных подклассов из std :: set <>? Это здорово, что вы можете это сделать. –
kfmfe04