170 похожих чатов

Народ, подскажите пожалуйста как мне написать deduction guide для вложенного

в структуру std::tuple?
В случае вектора я могу захватить переданные значения в фигурных скобках через std::initializer_list
#include <iostream>
#include <vector>

template<typename T>
struct Frame{
std::vector<T> children;
};
template<typename T> Frame(std::initializer_list<T>) -> Frame<T>;

int main(){
auto frame = Frame{.children = {111, 112, 113}};
std::cout << frame.children[0];
}
Здесь я указал для дедакт-гайда Frame(std::initializer_list<T>) -> Frame<T> и теперь могу инициализировать как Frame{.children = {1, 2, 3}}

Но теперь я хочу поменять std::vector на std::tuple
#include <iostream>
#include <tuple>

template<typename... T>
struct Frame{
std::tuple<T...> children;
};
template<typename...T> Frame(???) -> Frame<T...>;

int main(){
auto frame = Frame{.children = {123, 123.123, "123"}};
std::cout << std::get<0>(frame.children);
}
и не могу понять что мне нужно написать в конструкторе дедакт-гайда чтобы захватить список из фигурных скобок (в выражении Frame{.children = {123, 123.123, "123"}} где могут быть разные типы

10 ответов

19 просмотров

#include <iostream> #include <tuple> template<typename... Ts> struct Frame { std::tuple<Ts...> children; // Конструктор, принимающий std::tuple Frame(std::tuple<Ts...> t) : children(t) {} }; // Deduction guide template<typename... Ts> Frame(std::tuple<Ts...>) -> Frame<Ts...>; int main() { // Используем std::make_tuple для инициализации auto frame = Frame(std::make_tuple(123, 123.123, "123")); // Выводим первый элемент std::cout << std::get<0>(frame.children) << std::endl; }

Alexander Karaev
Попахивает чатгпт

Я бы сказал что воняет

Богдан- Автор вопроса
Antirtfm
#include <iostream> #include <tuple> template<typ...

А без make_tuple на колл-сайте возможно? Я хочу просто как Frame{.children = {123, 123.123, "123"}}

Богдан
А без make_tuple на колл-сайте возможно? Я хочу пр...

нельзя так, вывод типов ради вывода типов, запрещено стандартом

Богдан- Автор вопроса
Kelbon
нельзя так, вывод типов ради вывода типов, запреще...

Смотри что я хочу. Сейчас есть возможность через designated-initialzers вызвать конструктор для вложенного в структуру типа Children передавая в фигурных скобках разные типы #include <iostream> #include <vector> struct Children { Children(auto...arg){ ([](auto arg){ std::cout << arg << "\n"; }(arg), ...); } }; struct Frame { Children children; int left; int top; }; int main(){ auto frame = new Frame{ //вместо .children = Children{123, 123.123, "123"} .children = {123, 123.123, "123"}, .left = 10, .top = 20 }; } Но поскольку Children не является шаблонным то я не могу сохранить полученные аргументы (например в std::tuple) То есть мне нужно сделать шаблонной структуру Children и также ее родительскую структуру Frame и написать deduction-guide для проброса типов из конструктора Frame в конструктор Children Пока у меня получился рабочий пример но только с одним типом (где в deduction guide я захватывю фигурные скобки как std::initalizer_list<T>) #include <iostream> #include <vector> template<typename T> struct Frame{ std::vector<T> children; int left; int top; }; template<typename T> Frame(std::initializer_list<T>, auto...args) -> Frame<T>; int main(){ auto frame = new Frame{ .children = {1, 2, 3}, .left = 10, .top = 20 }; } Но попытка захватить фигурные скобки с разными типами (чтобы записать в std::tuple) уже не работает #include <iostream> #include <tuple> template<typename... T> struct Frame{ std::tuple<T...> children; int left; int top; }; template<typename... T> Frame(std::tuple<T...>, auto...args) -> Frame<T...>; int main(){ auto frame = new Frame{ .children = {123, 123.123, "123"}, .left = 10, .top = 20 }; } Я так понимаю проблема в том что указывая в deduction-guide Frame(std::tuple<T...>) -> Frame<T...> компилятор требует от меня явно передать std::tuple при инициализации auto frame = new Frame{ .children = std::tuple{123, 123.123, "123"}, .left = 10, .top = 20 }; но это некрасиво, я хочу каким-то образом захватить разные типы в фигурных скобках как в первом примере когда я могу вызвать конструктор Children без явного создания инстанса int main(){ auto frame = new Frame{ //вместо .children = Children{123, 123.123, "123"} .children = {123, 123.123, "123"}, .left = 10, .top = 20 }; } В С++ это вообще возможно сделать? Если нет то здесь явно напрашивается пропозал для добавления в стандартную библиотеку std::initializer_list но не для одного а для множества разных типов как std::initializer_list<T1, T2, T3, ...>

Богдан- Автор вопроса
Kelbon
сделай уже any_child

ты имеешь ввиду стирание типа? Я этого и пытаюсь избежать. Я сейчас изучаю какие есть возможности построить в С++ статическое дерево объектов (из нод разных типов)

Богдан
ты имеешь ввиду стирание типа? Я этого и пытаюсь и...

Компилировать ты это будешь годами, даже если сделаешь

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
49
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
@HemulGM Параметры у AddStream поменялись? Несостыковка какая-то
Катерина Свиридова
12
Народ, с прошедшими и наступающими. Ща полную ересь прогоню, но фишка в том, что это не обычная алкогольная ересь Либера, а я реально хз что делать. Сайт с 2012-го года Косяк...
Alexey Liber
2
Карта сайта