samrrr
> А чо, мету неосилил?
Что за мета?
MrShoor
> Что за мета?
Ну та самая entt::meta
samrrr
> Ну та самая entt::meta
Хотелось взять готовую сериализацию, а не писать собственную сериализацию по ходу дела.
MrShoor
> Хотелось взять готовую сериализацию
MrShoor
> upd. Да, проблема в констуркторах, которые удалены в entt::observer. Теперь
> собсна вопрос, как создать std::tuple как поле класса, если конструкторы
> удалены?
Ну, сделай их. Тебе, судя по всему, нужен конструктор перемещения. Его нет у обсервера? А какие у него есть? На крайняк, храни обсервера по унику.
MrShoor
> Не может
Так тебе надо рантайм цикл по полям тупля или компайлтайм?
В твоем первопосте нужен именно компайлтайм перебор всех полей. std::tuple вполне для этого подходит, итерируется с помощью Variadic-template (ссылку выше уже дали).
Went
> На крайняк, храни обсервера по унику.
Просто теперь просто интересно, можно ли сконструировать std::tuple так, чтобы не вызывался конструктор перемещения для его элементов.
Dmitry_Milk
> Так тебе надо рантайм цикл по полям тупля или компайлтайм?
>
> В твоем первопосте нужен именно компайлтайм перебор всех полей. std::tuple
> вполне для этого подходит, итерируется с помощью Variadic-template (ссылку выше
> уже дали).
Рантайм нужен, да, видел, итерирование по рантайм работает, я уже даже проверил. В общем вопрос в некоторой степени можно считать решенным.
MrShoor
> Просто теперь просто интересно, можно ли сконструировать std::tuple так, чтобы
> не вызывался конструктор перемещения для его элементов.
Эээ... То есть передать в код инициализации туплы не сами элементы, а те аргументы, которые должны быть вызваны у конструкторов его элементов? Что-то по аналогии с emplace?
Went
> Эээ... То есть передать в код инициализации туплы не сами элементы, а те
> аргументы, которые должны быть вызваны у конструкторов его элементов? Что-то по
> аналогии с emplace?
Да, как это сделать?
MrShoor
> Да, как это сделать?
Тупла конструируется по любой тупле того же размера, если её члены конструируются по членам этой туплы.
#include <iostream> #include <tuple> struct S { S(int& m_) : m( m_) {} int& m; }; int main( ) { int x = 1; std::tuple<S> s( std::tie( x)); std::get<0>( s).m = 2; std::cout << x; return 0; }
Ну, ты понимаешь, что если у тебя часть членов туплы конструируется только по умолчанию, а часть, например, имеет только конструктор двух аргументов, то такой трюк не взлетит - как тупла догадается, кому распределить какие аргументы? :)
Went
> как тупла догадается, кому распределить какие аргументы?
только явным указанием, можно перемежая std::make_tuple() с std::tuple_cat
https://en.cppreference.com/w/cpp/utility/tuple/tuple_cat
а std::reflexpr() ещё не завезли? чтобы не связываться с кортежами, а оставаться в структуре
вроде clang умеет
#!
> только явным указанием, можно перемежая std::make_tuple() с std::tuple_cat
Не совсем понимаю, как это поможет в нашем случае. Можно пример?
> а std::reflexpr() ещё не завезли? чтобы не связываться с кортежами, а
> оставаться в структуре
Мечты, мечты...
Went
> как это поможет в нашем случае
никак
но кажется понял, нужно что-то типа (псевдокод)
std::tuple<Immobile, int> t = std::make_tuple(std::ignore, 10);
любопытно, что обратно из tuple разложить не во все аргументы делается на раз через std::ignore как раз
#!
> но кажется понял, нужно что-то типа (псевдокод)
Это в частном случае. А вот в таком?
struct A { A(int); A( int, int); }; int main( ) { std::tuple<A, A> aa( std::make_tuple( 1, 2, 3)); // Что тут писать? 2 - это второй аргумент первого элемента или первый второго? return 0; }
Я так понимаю, функционала, необходимого для реализации подобных трюков, нет в самой тупле. Если городить свою туплу, можно на шаблонной магии нагородить что-то, но мы сейчас говорим о стандартной.
Went
> // Что тут писать? 2 - это второй аргумент первого элемента или первый второго?
std::tuple<A, A> aa(std::make_tuple( A{1, 2}, A{3}));