Задать вопрос
  • Как ограничить допустимые типы при описании шаблона типа в C++?

    @MarkusD Куратор тега C++
    Дмитрий Иванов , мнеб не хотелось, откровенно говоря, быть автором такого ответа. :)
    Сможешь подправить ссылку с меня на Adamos-а в своем ответе?
    Кстати, советую еще решением отметить ответ Виталия, т.к. он более подходит в обобщенном смысле.
  • Как ограничить допустимые типы при описании шаблона типа в C++?

    @MarkusD Куратор тега C++
    Дмитрий Иванов , погоди, я еще ничего не предложил. :)
    Хотя, раз у тебя все получилось, то это даже к лучшему. Хорошо. ))
  • Как ограничить допустимые типы при описании шаблона типа в C++?

    @MarkusD Куратор тега C++
    Дмитрий Иванов , как там с пояснением необходимости этого функционала?
  • Как ограничить допустимые типы при описании шаблона типа в C++?

    @MarkusD Куратор тега C++
    Adamos , не надо пересказывать учебники. Мне важно видеть, понимает ли человек то, что говорит.
    Очевидно, не понимаешь.
  • Как ограничить допустимые типы при описании шаблона типа в C++?

    @MarkusD Куратор тега C++
    Adamos , а как именно эти операторы должны облегчить жизнь Дмитрия? Можно с примерами и детальными пояснениями?
  • Как ограничить допустимые типы при описании шаблона типа в C++?

    @MarkusD Куратор тега C++
    Дмитрий Иванов , а давай еще напишем причину такой необходимости. Обычно такие выкрутасы бывают нужны только в двух случаях: 1- когда есть проблемы с организацией класса; 2- когда хочется быть злобным буратиной и сильно испортить себе(или другим) жизнь.
    Варианты решения вопроса есть, но чтобы с ними определиться, сперва надо понять его исподнюю.
  • Можно ли использовать shared_ptr в играх?

    @MarkusD Куратор тега C++
    ZSashka
    ведь производительность упадет, по сравнению с обычными указателями

    Для поддержки этого утверждения требуется детальное обоснование с приведением расчетов, разработкой методологии тестирования и доказательством через тестирование.
    Иначе утверждение является голословным.
  • Что вы скажете про язык Perl в разработке игр?

    MDtox
    Что вы скажете про язык Perl в разработке игр?

    Не тревожь мертвых, они этого не любят. :)
  • Как организовать структуру классов?

    @MarkusD Куратор тега C++
    Артем , полиморфизм в плюсах делается так же. Но есть одно важное отличие.
    В плюсах объекты могут храниться и передаваться по значению. В твоем Strategy[N] по своему значению будут лежать именно объекты типа Strategy, но не другого типа. Если хранить по ссылке или по указателю, то уже можно реализовать паттерн интерфейса.
    Этот вопрос уже относится к самым базовым навыкам владения языком. С полиморфизмом, наследованием и виртуальностью тебе стоит разобраться самому.

    Не рассмотрите вариант кратковременной платной консультации?

    Точно не рассмотрю. :) Я вижу что времени потребуется очень много, а мое время само по себе дорого. Т.е. сумма выйдет неподъемная и того она не стоит.
    Это базовый материал, он довольно легко осваивается в личном порядке. :)
  • Как организовать структуру классов?

    @MarkusD Куратор тега C++
    Артем , ну да, мышление ты себе после PHP еще долго ломать будешь. :)
    Но это если тебе хочется нормально писать на плюсах. А если не хочется, то с тонкостями плюсов лучше и не париться.
    Strategy - это, я так понимаю, ты просто назвал сущность по имени паттерна? Не самая лучшая мысль, слово слишком абстрактное и ничего не отражает. Хотя, в целом, не суть.

    А для чего тебе две активных стратегии в одно время? Почему не одна разединственная?
  • Как организовать структуру классов?

    @MarkusD Куратор тега C++
    Артем , смотри, давай загоним весь этот код в спойлеры, он не так интересен, как описание твоего вопроса.
    А следом давай более внятно распишем, для чего тебе эти стратегии нужны, зачем их сохранять в персистентную память и какой толк держать их в массиве.
    Сейчас на твой вопрос не получится дать ответ. Понятность вопроса под большим сомнением.
  • В какой последовательности изучать C++? Разница между junior/midle в С++?

    @MarkusD Куратор тега C++
    shmelevka , основная загвоздка в том, что нет Jun/Mid/Chif C++ Developer, есть Jun/Mid/Chif Software Engineer.
    Плюсы - это инструмент. Джун для работы на плюсах уже должен знать стандарт.
    UE/Qt/и.т.д. - это тоже инструменты.

    Дело в том, что знание инструментов никак не характеризует уровень профессионализма человека.
    Все эти карты освоения - это странные штуки для узкозашоренных "специалистов".

    Инженер решает задачи с помощью разных инструментов. Инструментом нужно уметь владеть. Знание документации инструмента никак не означает владение инструментом, это лишь базовая ступень на пути владения. Инструментом владеть мало, надо еще уметь выбирать инструмент. Теория выбора инструмента для решения задач - это тоже лишь малая часть пути к способности выбирать инструмент.
    А основным инструментом для любого инженера всегда были расчеты.
  • Как сделать разную реализацию одной и той же функции класса в C++?

    @MarkusD Куратор тега C++
    Никита Савиных , видимо, начинать тебе надо именно с простых вещей: читателей, писателей, подписчиков и делегатов...
    GoF можно почитать на эту тему.
    На Gamedev Lectures есть вольные пересказы GoF для упрощенки.
    Но стремиться, в плане UI и не только, стоит именно к подобному подходу.
  • Приведение типов указателей, как перегрузить?

    @MarkusD Куратор тега C++
    Kalombyr , ты ведь понимаешь, какой набор из самых экстраординарных ошибок и самых замысловатых трудностей ты для себя откроешь после добавления подобного механизма?
  • Как раскрыть parameter pack для передачи типов в шаблонную функцию?

    @MarkusD Куратор тега C++
    Армен , буквально? Черную магию! :)
    Это называется SFINAE.
    Аргумент функции в третьем варианте - это зануленный по умолчанию массив из указателей на функцию, один из путей SFINAE.
    В случае если этот массив имеет нулевую длину, вывод шаблона проваливается, но сама компиляция продолжится только если есть перегруженная функция, удовлетворяющая условиям вызова.

    SFINAE сработает тогда, когда список параметров будет пустым, это оборвет вывод шаблона и оставит только один вариант для вызова mapClasses<U>().
  • Как раскрыть parameter pack для передачи типов в шаблонную функцию?

    @MarkusD Куратор тега C++
    Армен , не, шаблонный параметр по умолчанию тут сыграет очень злую шутку с тобой.
    Смотри мой ответ.
  • Как раскрыть parameter pack для передачи типов в шаблонную функцию?

    @MarkusD Куратор тега C++
    Армен , компилятор тебе не ту ошибку пишет, что ты описал. :)
    Приведи текст самой ошибки, по ней будет понятно.
    Упреждая ответы, могу подсказать одну важную штуку. Ты делаешь раскрутку списка типов, тебе нехватает концевого случая, когда в args у тебя пустой список. И это не так-то просто сделать без 17го стандарта.
  • Как в С++ передать шаблонной функции std::string?

    @MarkusD Куратор тега C++
    Recardo_Recoly , тут я могу только посоветовать поизучать метапрограммирование. :)
    Есть вариант не писать почти одинаковый код для каждого типа, а обойтись только универсальными конструкциями для семейств типов. Но тебе надо обладать базисом знаний метапрограммирования. Обладать им нужно именно тебе хотябы просто потому что если вот я возьму и выкачу тебе рабочий код, он не будет решать полностью всех нужных тебе задач. И тебе потребуется расширить его, но ты ведь не сможешь. А это уже потеря самостоятельности.
  • Как в С++ передать шаблонной функции std::string?

    @MarkusD Куратор тега C++
    Recardo_Recoly , следи за руками. :)

    У тебя есть задача: сделать сериализацию значения произвольного типа.
    Включаем моск и начинаем думать. Как нам через одно имя функции обработать значения разных типов? Для этого у нас есть два механизма. Всего два.
    Первый механизм - это перегрузка функции. Удобная, простая как грабли. Главное - объявления вовремя подпихивай и все будет работать.
    Второй механизм - это шаблон функции и его частная специализация для конкретного типа данных. Это уже посложнее.

    Зачем тебе std::string из TValue, если TValue - это параметр шаблона? TValue становится известным только в момент вывода шаблона для конкретного типа. У тебя есть возможность сделать частную специализацию для типа std::string, в рамках которой уже нет никакого TValue, а есть конкретный std::string.

    При использовании любого из двух механизмов ты приходишь к одинаковому по своей сути выходу - у тебя есть функция, в которой есть параметр конкретного типа, с которым строго понятно как и что делать.
    Посмотри у меня в примере повнимательнее. У меня нет определения для шаблонной функции, есть только ее объявление. И это крайне важный момент.
    Определения есть только для случаев частной специализации этого шаблона. И это второй важный момент.
  • Что произойдёт после move-касте содержимого shared_ptr?

    @MarkusD Куратор тега C++
    MayRiv , мой ответ тут явно не нужен в таком случае, но пояснения я сделаю.
    Смотри...
    Чисто механически, между ссылкой и указателем разницы мало. Ссылка обязательна к инициализации при объявлении, не может быть переназначена и не требует разыменования. Указатель может быть нулевым, требует разыменования и может быть переназначен. Нужно понимать что и ссылка, и указатель, по своей сути - это граната без чеки в руках. Держи уверенно, но нежно, иначе все будет плохо.

    Семантику перемещения нужно правильно понимать. Для этого на хабре есть много статей и всегда есть C++ Core Guideline и стандарт.

    const rvalue - это нонсенс. Нужно убрать.
    Поле-ссылка на объект может использоваться только если время жизни объекта со ссылкой гарантированно меньше времени жизни объекта по ссылке. Иначе все плохо.
    В идеале, раз уж используете разделяемое владение (std::shared_ptr), то его и надо хранить, передавать, разделять и просто использовать.
    std::make_shared нужен для того, чтобы сформировать объект с разделяемым владением в едином неразрывном блоке памяти вместе с контрольным счетчиком владения. В качестве аргументов для std::make_shared передаются аргументы конструктора объекта. Зачем разыменовывать один std::shared_ptr и формировать перемещающую ссылку для конструирования другого std::shared_ptr? Это выглядит как нонсенс.
    Если надо переместить объект с разделенным владением, то лучше сделать перемещающее присвоение между инстанциями std::shared_ptr.

    В целом, это не код, а каша-какаша. Его надо просто переписать.
    С дизайном кода в текущих условиях помочь не смогу, т.к. опять же надо дать ответы на те мои вопросы. Нужно сперва понять ожидания от кода и только тогда определять видение и дизайн кода.