
Александр
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>())>;

Tema
31.05.2017
09:34:18

Google

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

Tema
31.05.2017
09:34:58
та же куча строк с выбором

Александр
31.05.2017
09:36:13
Слово template всего в двух местах, не говоря про <>
Я обычно заранее думаю про расширяемость удобную

Tema
31.05.2017
09:37:30

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?

Tema
31.05.2017
10:21:16

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

Tema
31.05.2017
10:25:36

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

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

Antony
31.05.2017
13:00:18

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

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

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

Antony
31.05.2017
13:34:33

Александр
31.05.2017
13:36:53

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, в крутых либах