• Куда кидать скачанные библиотеки в mingw?

    @MarkusD Куратор тега C++
    kaktak255, прошу обратить повторное внимание на П3.8 регламента работы сервиса.
    Код в изображениях размещать запрещено. Допустимо - только в виде текста, под соответствующим тегом.

    нашел исходники , решил затестить

    Тебе стоило сразу указать на источник того кода, который ты собираешь.
  • Что делать если отсутствует библиотека SFML?

    @MarkusD Куратор тега C++
    kaktak255, в C++ есть только одна стандартная библиотека - это STL.
    Все остальные стандартными не являются. SFML - это сторонний открытый проект и никто не обязан включать его в свои поставки.
  • Почему ГПСЧ нужно инициализировать в main()?

    @MarkusD Куратор тега C++
    HoShik, потому что так работает ГПСЧ. Он не столько инициализируется, сколько принимает некоторое зерно [?], от которого начинает строить последовательность псевдо-случайных чисел.
    При установке зерна происходит сброс состояния генератора. Если ты в цикле постоянно устанавливаешь одно и то же зерно, ты в результате получаешь ровно одну и ту же цепочку псевдо-случайных чисел внутри каждой итерации цикла.

    Обрати внимание на то как работает функция time [?]. В системах, которые придерживаются спецификации POSIX, результат можно интерпретировать как количество секунд. Т.е. раз в секунду результат time( nullptr ) будет меняться. Именно это и видно в приведенном тобой листинге.
    Сумма массива под номером 9 равна 73
    Сумма массива под номером 10 равна 76

    9й еще был в одной секунде, а 10й - уже в следующей.
  • Правильное применение const?

    @MarkusD Куратор тега C++
    oftywave , если коротко, это очень полезная практика. Определение константности данных сильно снижает вероятность ошибки случайного изменения и позволяет транслятору выбирать более жесткие оптимизации для производного кода.

    В наше время существует такой шуточный термин, как const nazi.
    В частности, Джон Кармак еще в 2013 году писал про себя: "I am a full const nazi nowadays, and I chide any programmer that doesn’t const every variable and parameter that can be."
    Лично я руководствуюсь подходом, при котором const играет большую роль в понимании кода читателем.
  • Как сделать связь между классами?

    m1kz , ты хочешь чтобы тебе в ответе код написали?
    Или тебе нужно чтобы тебе объяснили как сделать то, что тебе задано?
  • Откуда взялись дополнительные 4 байта?

    @MarkusD Куратор тега C++
    Eugene-123, не просто для этого, а прежде всего для того чтобы получить правильно выравненный адрес на конец экземпляра.
    Это качество размера сильно упрощает процессы подсчета размера и смещения, например, в стеке. Когда у тебя все размеры типов сформированы с учетом выравнивания, получение правильного адреса начала следующего экземпляра иного типа с учетом его, потенциально другого, собственного выравнивания может быть выполнено всего за одну операцию.
  • Откуда взялись дополнительные 4 байта?

    @MarkusD Куратор тега C++
    Eugene-123 , в типе Something первые 8 байт отданы на vtable, следующие 4 байта - на int some_field. Там без padding-а, все верно. Итого получается 12 байт.
    Выравнивание типа Something равно 8 байт, т.к. в его составе есть указатель vtable.
    Размер полей в 12 байт не кратен выравниванию на 8 байт, поэтому размер типа выводится как 16 байт.
    Дело в том, что размер типа всегда должен быть кратен выравниванию типа.
  • Как вернуть разные типы из std::function?

    @MarkusD Куратор тега C++
    impressive17 , любая функция в C++ может быть приведена к указателю на тип функции. Тип функции является строгим, он гарантирует правильную обработку переданных аргументов и правильный результат после выполнения функции.

    Лямбда - это тоже функция со своей сигнатурой и строгим типом. Вольность C++11 для лямбды позволяет определять тип возвращаемого значения по первому встреченному return в ее теле. Все прочие return обязаны в таком случае возвращать значение точно того же типа.
    Если специфицировать тип возвращаемого лямбдой значения используя TRT[?], то все возвращаемые из лямбды значения будут автоматически приводиться к указанному типу.
    Вот пример для наглядности.

    Вольность C++17 позволяет инстанцировать шаблоны типов на основании параметров конструктора шаблонного типа. Эта вольность вводит тебя в заблуждение когда ты пишешь std::function func{ ... };.
    В C++ все должно быть строго определено. C++17 просто позволяет часть этой строгости переложить с твоих плеч на плечи транслятора. Тебе же, в целях обучения, лучше взять все обеспечение строгости определений полностью на себя.
    В своем коде ты должен написать максимально конкретный и максимально понятный для тебя текст:
    std::function<Y ( int )> func{
    	[]( int z ) -> Y
    	{
    		if( z > 0 )
    		{
    			return X{};
    		}
    		
    		return Y{};
    	}
    };

    Только в этом случае и ты свой текст поймешь, и транслятор его тоже поймет так же, как и ты понимаешь.
  • Как вернуть разные типы из std::function?

    @MarkusD Куратор тега C++
    impressive17 , это нерабочий код. Он не пройдет трансляцию потому что тип значения нижнего return отличается от типа значения верхнего return.
    Это явно не тот код, который ты используешь. Или ты пока еще просто не в курсе что этот код не сходится со стандартом.
    Каким транслятором этот код собирается?
  • Как вернуть разные типы из std::function?

    @MarkusD Куратор тега C++
    impressive17, этот вопрос сейчас не получается понять. Я предполагаю что ты просто описываешь не то, что происходит у тебя в коде. Поэтому тебе нужно предоставить свой код.
  • Как вернуть разные типы из std::function?

    @MarkusD Куратор тега C++
    impressive17 , а почему в твоем вопросе нет описанного тобой кода?
  • Как вывести динамический массив в C++?

    @MarkusD Куратор тега C++
    Wasya UK, неуверенность - это тоже хорошо.
    Теперь у тебя есть лишний повод сходить в документацию и изучить механизм его работы. Изучение документации позволяет поднимать уверенность в своих знаниях.

    Range-based for-loop использует std::begin и std::end для определения границ итерирования. Голый указатель на память неизвестного размера принципиально не способен дать информацию ни о начале диапазона итерирования, ни о его конце.
    Тебе стоит использовать std::span[?] если ты пишешь в стандарте C++20. Иначе для тебя будет лучше найти или создать аналог std::span если ты хочешь использовать именно range-based for-loop в коде.
  • Как вывести динамический массив в C++?

    @MarkusD Куратор тега C++
    Wasya UK, ты знаешь как внутри устроен range-based for-loop, который ты использовал в своем коде?
  • Как вывести динамический массив в C++?

    @MarkusD Куратор тега C++
    Wasya UK, нет. Там нет присвоения пустого массива.
    Часть = {} выполняет сразу две операции.
    Первая операция находится в коде {} - это формирование пустого списка инициализации [?]. Эта операция сводится к формированию local temporary [?] с типом int* и инициализации этого temporary local методом default initialization [?], который для данного типа сводится к методу zero initialization [?].
    Результатом Zero initialization для int* будет nullptr.
    Вторая операция находится в коде = и выполняет инициализацию определенного arr значением ранее выведенного temporary local и с использованием метода copy initialization [?].
    Все вместе это сводится к инициализации arr методом zero initialization.

    У тебя в функции нет массивов. У тебя там есть только указатель, который по умолчанию инициализируется в nullptr и без проверки поступает в область разыменования. Это все приводит к неопределенному поведению [?].
  • Как вывести динамический массив в C++?

    @MarkusD Куратор тега C++
    Wasya UK, снова неверно. Код int *arr производит определение указателя на память с предположительным типом int.
    У тебя нигде нет определения массива. Есть указатель на память, в которой может быть какой-то произвольный массив или просто единичное значение. И узнать это из указателя возможности у тебя нет.

    Теперь давай снова вернемся к коду int *arr = {}. Что в точности означает = {} в этом коде?
  • Как вывести динамический массив в C++?

    @MarkusD Куратор тега C++
    Wasya UK, это не так. int *arr не определяет тип массива.
    Что в точности определяет код int *arr?
  • Как вывести динамический массив в C++?

    @MarkusD Куратор тега C++
    Wasya UK , давай для начала выясним, что происходит в этом коде: int *arr = {}?
  • Как создать шаблон от наследников определенного класса?

    @MarkusD Куратор тега C++
    Eugene-123, да. И не сконвертирует. Это два полностью разных типа, никак между собой не связанных.
    Выбранное тобой решение не является таковым.

    Если этот NodeContainer ведет себя как std::shared_ptr, то тебе стоит использовать std::shared_ptr и не тратить силы на свои аналоги. std::shared_ptr позволяет приведение к типу.
    Но, тем не менее, я так и не понял для чего тебе нужен шаблонный NodeContainer и какую задачу ты решаешь через иерархию NodeBase. Если тебе интересно изучить действительно качественное решение твоей задачи, тебе стоит постараться объяснить.
  • Как создать шаблон от наследников определенного класса?

    @MarkusD Куратор тега C++
    Eugene-123, а что за задачу ты таким образом решаешь?
  • Как создать шаблон от наследников определенного класса?

    @MarkusD Куратор тега C++
    Eugene-123 , обобщенные типы C# ничего общего не имеют с шаблонами C++.
    Я надеюсь, ты понимаешь что NodeContainer<RedNode> и NodeContainer<BlueNode> будут являться абсолютно разными типами? Просто я не представляю, как ты будешь с этим работать.
    Какую задачу ты хочешь решить через иерархию от NodeBase?