Deleted Account
ну типа переопределяеш все методы
Anonymous
тоесть ответ на мой вопрос - никак?
Deleted Account
Scene
{
grscenemethod()
{return GraphicsScenemember.grscenemethod()}
}
Yury
Фабрики же не какой-то магией объект создают.
Yury
Смотри, что там, продублируй в своей фабрике.
Yury
А что это за движок?
Anonymous
GraphicsScene* graphicsScene = graphics -> createScene(....);
PhysicsScene* physicsScene = physics -> createScene(....);
Anonymous
И я не знаю что там внутри createScene
Anonymous
Anonymous
PhysX*
Anonymous
я могу сделать композицией, но это не то что нужно. Композиция имеет ввиду: объект состоит из чего-то. А наследование: объект есть что-то
Anonymous
Как раз Scene - это класс, который есть физическая сцена и графическая сцена
Anonymous
а не так что Scene - состоит из графической и физической сцены
Anonymous
я могу конечно в фабрике, которая создает объекты Scene хранить все сцены вот так:
std :: map<std :: string, std :: pair<GraphicsScene*, PhysicsScene*» scenes
Григорий
всем привет
Anonymous
здарова
Григорий
я тут пытаюсь мигрировать с 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
да хуй его знает.
🐙 Antony
Aidar
Aidar
Создавать объекты так же как и любые другие
Григорий
Григорий
а в стандарте по этой теме что-нибудь сказано? Почему старый компилятор это спокойно переваривал, а новый — нет
Григорий
хотя, насколько я понял, компилятор MS не всегда следует стандарту
🐙 Antony
Скорее всего, это какой-то глюк старой версии компилятора.
Григорий
т.е. так в принципе нельзя делать? или нет смысла?
Григорий
вообще проект довольно дикий, оригинальный разработчик очень давно уволился. например, у этих "полей", которые оказывается и не поля, объявлен дополнительный спецификатор LOGGER_API, видимо, кто-то планировал обращаться к ним извне DLL
Григорий
но... *барабанная дробь*
Григорий
они в приватной секции класса
Григорий
и френдов нет
Григорий
и спросить не у кого, что имелось в виду
Aidar
Этож инстанс класса
Aidar
Шаблона*
Aidar
Ну логично что доступ к ним хотели сделать извне иначе нафига инстансить
🐙 Antony
т.е. так в принципе нельзя делать? или нет смысла?
Так делать можно и порой нужно (например если вы хотите чтобы тело вашего шаблонного класса скомпилировалось куда-то в dll). Делать так для стандартных классов - странновато (моё предположение, что прошлый разработчик натолкнулся на проблему со статической линковкой стандартной библиотеки к dll http://www.boost.org/doc/libs/1_64_0/doc/html/boost_dll/missuses.html и пытался так её обойти)
Aidar
Ппц
Aidar
У меня в Лабе подгрузка функций выглядит как ваш буст дол вызов оказывается
Aidar
Длл*
🐙 Antony
Сами писали?
Aidar
Да лабы по винапи были
Aidar
Только разбор имён я не завез
Aidar
Поэтому надо писать было настоящие
🐙 Antony
🐙 Antony
Поздравляю, вы сделали всё верно
🐙 Antony
;)
Aidar
Кстати magic_get расширяем? ну если мне хочется както спецефично определить get для типа например?
Aidar
типа field_info
🐙 Antony
А какой именно специфики хочется добавить?
Александр
А какой именно специфики хочется добавить?
О, я хотел бы уметь получать tuple из указателей на поля!
struct A { int a; float b; }
auto fields = magic_field_get<A>();
fields == std::tuple<int A::*, float A::*>(&A::a, &A::b);
Крылатый
https://kristerw.blogspot.ru/2017/05/interprocedural-optimization-in-gcc.html
🐙 Antony
Александр
Хотя, вижу проблему в том, что для получения значений указателей придётся походить около UB
🐙 Antony
Просто скастовать не получится - указатель на поле/функцию класса на самом деле 2 указателя + пачка костылей на некоторых платформах, чтобы это знание скрыть от пользователя. Просто reinterpret_cast не поможет
Александр
Так вроде ж указатель на поле - это просто смещение от начала структуры?
Александр
С функциями ясно, там всякая виртуальность мешает
Александр
Dmitry
...
Dmitry
сейчас изобрели какой-нибудь новый модный способ узнать существует ли метод у класса?
🐙 Antony
да, называется detection idiom
Dmitry
где он находится?
Александр
в гугле, на SO, в крутых либах
Александр
там всё тот же SFINAE юзается
Dmitry
http://en.cppreference.com/w/cpp/experimental/is_detected оно?
🐙 Antony
да, оно
Александр
decltype(std::declval<T>.somemethod(std::declval<int>()))
Александр
опа
Александр
в стандарт завезли что ли
Dmitry
ехал деклвал через деклвал
Александр
🐙 Antony
Если нужна упрощенная имплементация, то как-то вот так:
https://github.com/apolukhin/magic_get/blob/develop/include/boost/pfr/detail/detectors.hpp#L14-L27
Yury
Господа, подскажите простой способ задать шаблон наследника класса для c++ 11?
Yury
Что-то вроде template<class T : BaseClass>, только чтобы компилировалось 😁
🐙 Antony
Вот это подойдёт?
static_assert(std::is_base_of<BaseClass, T>::value, "")