Войти
ПрограммированиеФорумОбщее

Крестопроблемы (3 стр)

Страницы: 1 2 3 4 Следующая »
#30
4:12, 24 янв 2023

samrrr
> А чо, мету неосилил?
Что за мета?

#31
4:54, 24 янв 2023

MrShoor
> Что за мета?
Ну та самая entt::meta

#32
5:07, 24 янв 2023

samrrr
> Ну та самая entt::meta
Хотелось взять готовую сериализацию, а не писать собственную сериализацию по ходу дела.

#33
5:17, 24 янв 2023

MrShoor
> Хотелось взять готовую сериализацию
Изображение

#34
9:10, 24 янв 2023

MrShoor
> upd. Да, проблема в констуркторах, которые удалены в entt::observer. Теперь
> собсна вопрос, как создать std::tuple как поле класса, если конструкторы
> удалены?
Ну, сделай их. Тебе, судя по всему, нужен конструктор перемещения. Его нет у обсервера? А какие у него есть? На крайняк, храни обсервера по унику.

#35
10:11, 24 янв 2023

MrShoor
> Не может

Так тебе надо рантайм цикл по полям тупля или компайлтайм?

В твоем первопосте нужен именно компайлтайм перебор всех полей. std::tuple вполне для этого подходит, итерируется с помощью Variadic-template (ссылку выше уже дали).

#36
16:46, 24 янв 2023

Went
> На крайняк, храни обсервера по унику.
Просто теперь просто интересно, можно ли сконструировать std::tuple так, чтобы не вызывался конструктор перемещения для его элементов.

Dmitry_Milk
> Так тебе надо рантайм цикл по полям тупля или компайлтайм?
>
> В твоем первопосте нужен именно компайлтайм перебор всех полей. std::tuple
> вполне для этого подходит, итерируется с помощью Variadic-template (ссылку выше
> уже дали).
Рантайм нужен, да, видел, итерирование по рантайм работает, я уже даже проверил. В общем вопрос в некоторой степени можно считать решенным.

#37
17:44, 24 янв 2023

MrShoor
> Просто теперь просто интересно, можно ли сконструировать std::tuple так, чтобы
> не вызывался конструктор перемещения для его элементов.
Эээ... То есть передать в код инициализации туплы не сами элементы, а те аргументы, которые должны быть вызваны у конструкторов его элементов? Что-то по аналогии с emplace?

#38
19:43, 24 янв 2023

Went
> Эээ... То есть передать в код инициализации туплы не сами элементы, а те
> аргументы, которые должны быть вызваны у конструкторов его элементов? Что-то по
> аналогии с emplace?
Да, как это сделать?

#39
20:11, 24 янв 2023

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;
}

Смотри конструктор номер (3)

Ну, ты понимаешь, что если у тебя часть членов туплы конструируется только по умолчанию, а часть, например, имеет только конструктор двух аргументов, то такой трюк не взлетит - как тупла догадается, кому распределить какие аргументы? :)

#40
(Правка: 22:17) 22:08, 24 янв 2023

Went
> как тупла догадается, кому распределить какие аргументы?
только явным указанием, можно перемежая std::make_tuple() с std::tuple_cat
https://en.cppreference.com/w/cpp/utility/tuple/tuple_cat

а std::reflexpr() ещё не завезли? чтобы не связываться с кортежами, а оставаться в структуре
вроде clang умеет

#41
22:35, 24 янв 2023

#!
> только явным указанием, можно перемежая std::make_tuple() с std::tuple_cat
Не совсем понимаю, как это поможет в нашем случае. Можно пример?

> а std::reflexpr() ещё не завезли? чтобы не связываться с кортежами, а
> оставаться в структуре
Мечты, мечты...

#42
(Правка: 23:59) 23:09, 24 янв 2023

Went
> как это поможет в нашем случае
никак

но кажется понял, нужно что-то типа (псевдокод)

std::tuple<Immobile, int> t = std::make_tuple(std::ignore, 10);

любопытно, что обратно из tuple разложить не во все аргументы делается на раз через std::ignore как раз

+ Показать
#43
(Правка: 9:54) 8:57, 25 янв 2023

#!
> но кажется понял, нужно что-то типа (псевдокод)
Это в частном случае. А вот в таком?

struct A
{
  A(int);
  A(int, int);
};

int main()
{
  std::tuple<A, A> aa(std::make_tuple(1, 2, 3)); // Что тут писать? 2 - это второй аргумент первого элемента или первый второго?
  return 0;
}

Я так понимаю, функционала, необходимого для реализации подобных трюков, нет в самой тупле. Если городить свою туплу, можно на шаблонной магии нагородить что-то, но мы сейчас говорим о стандартной.

#44
(Правка: 10:03) 10:03, 25 янв 2023

Went
> // Что тут писать? 2 - это второй аргумент первого элемента или первый второго?

std::tuple<A, A> aa(std::make_tuple(A{1, 2}, A{3}));
Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумОбщее