@ProCxx

Страница 921 из 2477
Александр
31.05.2017
09:30:12
Tema
31.05.2017
09:31:00
нахуя я тут шаблонав наделал, лучше бы просто отнаследовался

Александр
31.05.2017
09:34:00
С современным c++ это удобно делается через template <Enum e> decltype(auto) helper() { if constexpr (e == Enum::foo) { return (Type1*)nullptr; } else if constexpr (...) .... } template <Enum e> using enum_to_type_t = std::remove_pointer<decltype (helper<e>())>;

Google
Александр
31.05.2017
09:34:48
17. 14 только через специализацию

Александр
31.05.2017
09:36:13
Слово template всего в двух местах, не говоря про <>

Я обычно заранее думаю про расширяемость удобную

Aidar
31.05.2017
09:45:10
Специализация шаблона более раширяема

Чем ифики

Bretbas
31.05.2017
10:00:11
здарова всем

ребят есть вопросик. Допустим есть класс сцены GraphicsScene, который создает только класс Graphics. Есть класс физики сцены PhysicsScene - его создает класс Physics. Если я наследую от GraphicsScene и PhysicsScene класс Scene, то как создавать экземпляры этого класса?

reagentoo
31.05.2017
10:04:53
множественное наследование?

Bretbas
31.05.2017
10:12:13
да

Google
Aidar
31.05.2017
10:15:11
Как создавать всмысле где создавать или что?

Bretbas
31.05.2017
10:20:08
Еще раз повторяю, класс Graphics является фабрикой для создания экземпляров класса GraphicsScene и только он может его создать. Класс Physics является фабрикой для создания экземпляров класса PhysicsScene и только он может его создать. Я хочу организовать класс Scene, который наследуется от классов GraphicsScene и PhysicsScene(множественное наследование). Как мне создать экземпляры классов Scene?

Bretbas
31.05.2017
10:24:48
зделай фабрику для создания экземпляров класса Scene
ну хорошо, а что в ней? Как мне правильно инициализировать правильно экземпляры в этой фабрике?

Ведь часть интерфейса класса Scene должна создаваться по правилам GraphicsScene, а другая часть по правилам PhysicsScene.

Tema
31.05.2017
10:25:36
ну хорошо, а что в ней? Как мне правильно инициализировать правильно экземпляры в этой фабрике?
ну если Scene композицией зделано то там пара мемберов созданых предыдущими фабриками а если множественое наследование то это залёт

Bretbas
31.05.2017
10:25:53
композицией понятно что легко

а вот если наследованием...

Tema
31.05.2017
10:26:02
а вот если наследованием...
мож можно внутрение мемберы подвесить на интерфейс получапный от наследования

ну типа переопределяеш все методы

Bretbas
31.05.2017
10:27:00
тоесть ответ на мой вопрос - никак?

Tema
31.05.2017
10:27:49
Scene { grscenemethod() {return GraphicsScenemember.grscenemethod()} }

Yury
31.05.2017
10:28:12
Фабрики же не какой-то магией объект создают.

Смотри, что там, продублируй в своей фабрике.

А что это за движок?

Bretbas
31.05.2017
10:29:57
GraphicsScene* graphicsScene = graphics -> createScene(....); PhysicsScene* physicsScene = physics -> createScene(....);

И я не знаю что там внутри createScene

А что это за движок?
один из них PhyX

PhysX*

Google
Bretbas
31.05.2017
10:38:26
я могу сделать композицией, но это не то что нужно. Композиция имеет ввиду: объект состоит из чего-то. А наследование: объект есть что-то

Как раз Scene - это класс, который есть физическая сцена и графическая сцена

а не так что Scene - состоит из графической и физической сцены

я могу конечно в фабрике, которая создает объекты Scene хранить все сцены вот так: std :: map<std :: string, std :: pair<GraphicsScene*, PhysicsScene*» scenes

Gregor
31.05.2017
11:00:02
всем привет

Bretbas
31.05.2017
11:00:10
здарова

Gregor
31.05.2017
11:00:28
я тут пытаюсь мигрировать с VS2005 на VS2012 с легаси проектом

вылазит ошибка, которую я, прочитав msdn, так и не понял как поправить

внутри класса есть такие два поля: template class LOGGER_API std::allocator<std::string>; template class LOGGER_API std::vector<std::string, std::allocator<std::string> >;

error C2252: an explicit instantiation of a template can only occur at namespace scope

почему раньше работало, теперь нет?

Ssi
31.05.2017
11:05:42
да хуй его знает.

Antony
31.05.2017
11:08:59
внутри класса есть такие два поля: template class LOGGER_API std::allocator<std::string>; template class LOGGER_API std::vector<std::string, std::allocator<std::string> >;
Предполагая что часть форматирование сеъел телеграм - это не поля. Это запрос на явное инстанцирование шаблона. Скорее всего вам надо просто удалить эти строчки

Aidar
31.05.2017
11:10:34
Создавать объекты так же как и любые другие

Gregor
31.05.2017
11:19:13
а в стандарте по этой теме что-нибудь сказано? Почему старый компилятор это спокойно переваривал, а новый — нет

хотя, насколько я понял, компилятор MS не всегда следует стандарту

Antony
31.05.2017
11:27:54
Скорее всего, это какой-то глюк старой версии компилятора.

Gregor
31.05.2017
11:32:54
т.е. так в принципе нельзя делать? или нет смысла?

Google
Gregor
31.05.2017
11:34:19
вообще проект довольно дикий, оригинальный разработчик очень давно уволился. например, у этих "полей", которые оказывается и не поля, объявлен дополнительный спецификатор LOGGER_API, видимо, кто-то планировал обращаться к ним извне DLL

но... *барабанная дробь*

они в приватной секции класса

и френдов нет

и спросить не у кого, что имелось в виду

Aidar
31.05.2017
11:36:59
Этож инстанс класса

Admin
ERROR: S client not available

Aidar
31.05.2017
11:37:26
Шаблона*

Ну логично что доступ к ним хотели сделать извне иначе нафига инстансить

Antony
31.05.2017
11:39:06
т.е. так в принципе нельзя делать? или нет смысла?
Так делать можно и порой нужно (например если вы хотите чтобы тело вашего шаблонного класса скомпилировалось куда-то в dll). Делать так для стандартных классов - странновато (моё предположение, что прошлый разработчик натолкнулся на проблему со статической линковкой стандартной библиотеки к dll http://www.boost.org/doc/libs/1_64_0/doc/html/boost_dll/missuses.html и пытался так её обойти)

Aidar
31.05.2017
11:40:08
Ппц

У меня в Лабе подгрузка функций выглядит как ваш буст дол вызов оказывается

Длл*

Antony
31.05.2017
11:43:14
Сами писали?

Aidar
31.05.2017
11:43:47
Да лабы по винапи были

Только разбор имён я не завез

Поэтому надо писать было настоящие

Antony
31.05.2017
11:47:17
Поздравляю, вы сделали всё верно

;)

Aidar
31.05.2017
12:02:22
Кстати magic_get расширяем? ну если мне хочется както спецефично определить get для типа например?

Google
Aidar
31.05.2017
12:02:29
типа field_info

Antony
31.05.2017
12:12:33
А какой именно специфики хочется добавить?

Александр
31.05.2017
12:34:45
А какой именно специфики хочется добавить?
О, я хотел бы уметь получать tuple из указателей на поля! struct A { int a; float b; } auto fields = magic_field_get<A>(); fields == std::tuple<int A::*, float A::*>(&A::a, &A::b);

Дед Пегас
31.05.2017
12:42:15
https://kristerw.blogspot.ru/2017/05/interprocedural-optimization-in-gcc.html

Александр
31.05.2017
13:05:10
Хм... сходу не могу придумать, как такое сделать из коробки
Так ведь есть сейчас get<I>, который выдаёт знает тип и смещение поля. Подсовываем ему std::declval<T>, кастуем к указателям. Или так не сработает?

Хотя, вижу проблему в том, что для получения значений указателей придётся походить около UB

Antony
31.05.2017
13:13:39
Просто скастовать не получится - указатель на поле/функцию класса на самом деле 2 указателя + пачка костылей на некоторых платформах, чтобы это знание скрыть от пользователя. Просто reinterpret_cast не поможет

Александр
31.05.2017
13:15:14
Так вроде ж указатель на поле - это просто смещение от начала структуры?

С функциями ясно, там всякая виртуальность мешает

Antony
31.05.2017
13:34:33
Так вроде ж указатель на поле - это просто смещение от начала структуры?
А ведь верно. Но циферку offset кастовать к типу 'указатель на поле' - это UB. Добавлять пока такое не хочется

reagentoo
31.05.2017
15:20:39
...

сейчас изобрели какой-нибудь новый модный способ узнать существует ли метод у класса?

Antony
31.05.2017
15:21:59
да, называется detection idiom

reagentoo
31.05.2017
15:22:34
где он находится?

Александр
31.05.2017
15:23:07
в гугле, на SO, в крутых либах

Страница 921 из 2477