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 ответов

36 просмотров

#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

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

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

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

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

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

Ребят в СИ можно реализовать ООП?
Николай
33
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем доброго вечера. Разрабатываю 32 раз. приложение в Delphi. Столкнулся с тем, что стандартный  TFilestream  не работает с большим файлом > 2 ГБайт (после вызова функции see...
Vadim Gl
16
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
добрый день. Подскажите, есть сайт на 1.4.7 и я хочу обновиться, особо ничего не меняя. мне выбирать версию 1.4.35 или третью ветку? и можно ли обновлять "как есть", или нужно...
Digital Cat
12
Кто кодит под Лазарем на винде, у вас аналогично VCL переопределяются CreateWnd и CreateParams для конкретных классов контролов и все заданные флаги влияют?
А Андрей
11
У меня задача: написать брокер сообщений. Очереди и потребители. Очереди поддерживают приоритеты. Очередь отдает сообщения, только обработчикам с соответствующими характеристи...
Aleksandr Filippov
2
народ, плиз хелп, всю голову сломал себе уже... разве может быть так, что GetProcAddress( GetModuleHandle( "kernel32.dll" ), "SetThreadDescription" ) вернёт ненулевое значение...
Iluha Companets
12
А, ты про текущую реализацию? Нет конечно, я бы сделал правильно - сейчас там гавнокод
Александр (Rouse_) Багель
6
Карта сайта