Anton
struct A { A(B b); }; struct B { B(int, int); }; Возмём простой случай. B можно без явного вызова конструктора заинитить?
Ioann_
Нет, вроде. default constructor же удален...
Ну вот если использовать разные cast-ы, то можно получить объект типа B :)
Anton
Нет, вроде. default constructor же удален...
Он и не нужен. Я хочу передавать два инта в B, который потом передастся в A.
Anton
И при том без явного вызова конструктора B.
Ioann_
Reinterpret cast в помощь тебе, ну, наверное ?
Ioann_
Все зависит от того какая именно структура у B
Ioann_
У меня например в проекте есть структура D3, просто три дабла x y z. Но при этом можно обращаться и по индексу :)
Tom
Он и не нужен. Я хочу передавать два инта в B, который потом передастся в A.
Все равно не пойму "передать два инта в В"... Ты хочешь сконструировать А, используя два инта? И не вызывая конструктор В, так?
Anton
Все равно не пойму "передать два инта в В"... Ты хочешь сконструировать А, используя два инта? И не вызывая конструктор В, так?
Хочу сконструировать А, передав В, который должен в идеале неявно сконструироваться при передаче двух интов.
Tom
Хитро... а возможно ли такое вообще в С++03
Tom
В С++11-то автоматом...
Ioann_
Tom
Не ну это читерством называется ;)
Anton
Причём конкретным.
Aidar
Пруфов что оно работает нет
Александр
Без variadic'ов совсем печально
Ioann_
Ioann_
Работает :)
Aidar
Ну это не пруф
Aidar
Зато есть пруфы что оно не работает
Aidar
Уб=не работает
Aidar
А частные случаи не нужны
Aidar
Ты же математик
Ioann_
Ну если ты про ub, то я про это написал выше. Хотя если честно я не знаю точно, гарантирует ли стандарт, что данные всегда будут одинаково варывниваться(без pragma align и т.п) и т.п Так как если этот момент нарыть, то это может быть и не ub.
Aidar
Это в любом случае уб
Aidar
Потому что ты реинтнрпреткастишь на тот тип который не был изначально
Ioann_
Но, ты еще просто код win32k не видел, частично утекший в нулевых. Там кажется, ребята не знают что такое стандарт :)
🦥Alex Fails
/cppref cast
FailsBot
Search results for "cast" 1. std::any_cast 2. std::bad_cast 3. std::bad_any_cast 4. const_cast conversion 5. static_cast conversion 6. dynamic_cast conversion 7. std::const_pointer_cast 8. std::static_pointer_cast 9. std::dynamic_pointer_cast 10. std::chrono::duration_cast 11. reinterpret_cast conversion 12. std::experimental::any_cast 13. std::chrono::time_point_cast 14. case label 15. As-if rule 16. std::map::at 17. std::array::at 18. std::deque::at 19. std::tuple_cat 20. std::string::at 21. std::vector::at 22. std::wstring::at 23. std::pmr::map::at 24. std::u16string::at 25. std::u32string::at 26. std::pmr::deque::at 27. std::pmr::string::at
Aidar
Что такое pmr
Aidar
Преднестровье?
Ruslan
😂
Ioann_
Причём конкретным.
А почему не сделать деф конструктор и сеттер ? Там просто потом создаешь временный объект вызываешь сеттер и дело в шляпе :?
Ioann_
Тогда ты минуешь конструктор с двумя интами
Aidar
Там параметры неизвестны
Roman
multi-index контейнеров в STL или Qt нет я так понимаю? map<pair<K1, K2>, D> мне к сожалению не помогает, поскольку pair - по прежнему один ключ лишь состоящий из нескольких компонентов, по одному только K1 я не найду D
Anton
Тогда ты минуешь конструктор с двумя интами
Мне как раз и надо вызывать конструктор с двумя интами)
Ioann_
А, ты хочешь чтобы просто не было списка инициализации ?
Aidar
Это си++03
Ioann_
То есть конструктор вызвали, но он ничего не инитил ?
Roman
Есть вроде у qt что то вроде QMultiMap
multimap это же вроде single-key -> multiple data
Ioann_
Это си++03
Я понял, просто вон та штучка в конструкторе, когда двоеточие пишешь так вроде называется.
Aidar
Сделай свой тип ключ
Aidar
Придумай как нибудь
mefest
Вообще тоже самое, просто дубли будут
Aidar
Определи хэш или оператор меньше
Aidar
И сделай поиск этих типоа
Александр
обертку запилить на вариадиках с N контейнерами
Roman
А надо наоборот?
угу, у одной структуры данных несколько разных индексов, т.е. ключей, по каждому из которых нужно уметь находить.. по старинке создать QMap<K1, D> и QMap<K2, QMap::iterator>?
Anatoly
только QMultiMap
Anatoly
поскольку K1 и K2 не ключи в классическом их понимании
Roman
только QMultiMap
QMultiMap равносильно QMap<K, QList<D> >
Ruslan
mefest
В чем проблема указать одни данные у разных ключей?
Roman
В чем проблема указать одни данные у разных ключей?
K1 и K2 это разные типы во первых.. во вторых придётся хранить указатели дабы память не жрать
Anatoly
ключ в классическом понимание однозначно идентифицирует сущность, в multi map для одного "ключа" допускается несколько значений
Roman
два контейнера
я так и собирался делать мол map<K1, D> и map<K2, map<K1,D>::iterator> просто задаюсь вопросом нет ли альтернативного, более элегантного решения
Александр
можно сделать struct Key { std::optional<K1> key1; std::optional<K2> key2; } и перегрузить для него оператор == как равенство одного из двух полей. Правда тогда (a == b) && (b == c) != (a == c), но для мапы пойдёт
Roman
ключ в классическом понимание однозначно идентифицирует сущность, в multi map для одного "ключа" допускается несколько значений
верно, у меня всё с точностью наоборот, у меня несколько разных ключей (разных типов) индексируют одну структуру данных
Anatoly
ну, подруби http://www.boost.org/doc/libs/1_64_0/libs/multi_index/doc/tutorial/index.html
Roman
можно сделать struct Key { std::optional<K1> key1; std::optional<K2> key2; } и перегрузить для него оператор == как равенство одного из двух полей. Правда тогда (a == b) && (b == c) != (a == c), но для мапы пойдёт
чёт как-то не особо... легче класс написать в котором 2 мапы хранить и оператор перегрузить и для того и для того типа а потом проверять разные мапы, более производительно будет мне кажется
Roman
производительнее вообще с нуля написать
ассоциативный контейнер?)) по времени как-бэ неоптимально, класс написать - минута
Roman
ладно
Roman
оставлю как есть, класс с перегруженым operator[] и двумя мапами map<K1, D> и map<K2, map<K1,D>::iterator>
Berkus
strong typedef, конечно же!
ну это не расширением делается же
Крылатый
ну это не расширением делается же
Всяко нужно раскуривать шланг и править его.
Berkus
перфект форвардинг и варарги
Berkus
расширения с готовым аст работают, чтобы его получить надо парсер править