Вы видите копию треда, сохраненную 16 ноября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
• https://github.com/sosachbot/cppthreadhat/wiki
Ответы на вопросы:
• http://en.cppreference.com/w/
• http://www.cplusplus.com/reference/
Прошлый тонет тут >>1482318 (OP)
type* - это же именно отдельный тип данных, следовательно, лучше относить его к первому варику.
Я понимаю как примерно работают ссылки и указатели по отдельности, я даже понимаю что значит *a = &b, но вот эту штуку я вижу впервые и не могу нагуглить что это.
Ссылка на указатель?
Это та же ссылка, только на указатель.
вроде как, впервые вижу чтоб вобще кто то так писал
>Ссылка на указатель?
Может это как ссылка от указателя на целочисленный тип? То есть это может пригодится при работе с массивом (не ебу как, но может).
о
д
у
л
и
Когда ты пишешь один, то наверное незачем. А если несколько человек, то у каждого своя задача и кто то может написать одну часть программы, а другой использовать ее не вникая в то как оно работает, и взаомодействовать с ней с помощью геттеров и сеттеров.
Ну, так, если он получает значение просто публичной переменной, то он тоже особо не будет вникать.
Публичные переменные не нужны. А ещё может понадобиться потокобезопасность, тогда с методами можно сделать так, чтобы было последовательное выполнение при одновременных вызовах.
Тут это нахуй не нужно. Видимо имеется в виду что в нормальном классе будут проверки дат на валидность.
Возможно, что прежде чем записать значение в переменную нужно это значение обработать. Например проверить чтобы значение лежало в определенном диапазоне, а если нет, то привести значение в необходимый вид.
Вот, сука, нигде такой хуйни нет, но в с++ есть.
Я имею ввиду ТАКАЯ инкапсуляция посредством хэдеров.
А что с этим не так? Поясните, я правда не знаю, плохо знаком с другими языками. Как по другому инклюды делать? Тебе же не нужна вся реализация, она в библиотеках, тебе нужен только интерфейс.
>Это все из-за наследия сишки
Yes.
>имеет какой-то сакральный древний смысл
Tut tozhe yes. Правда не древний нихуя.
Во-первых, потому что в плюсах всё ещё нет модулей (выйдут в 20 версии, уже утверждены), и хэдэры подставляются как есть — текстом. Каждый #include — это просто текстовая подставка, которую надо парсить по новой. В более новых языках есть модули и код всегда парсится только 1 раз.
Во-вторых, а где ты реализацию с интерфейсом-то в куче видел? В го и скриптовых яязыках?
>Во-вторых, а где ты реализацию с интерфейсом-то в куче видел?
Разве в джаве не так? Ты же не делаешь джва файла на класс.
Здравствуйте аноны. Вопрос по с, но напишу сюда, т.к. предполагаю, что С полумертв, а большие братки не откажут.
Вопрос достаточно нубский.
Хочу вместе с хедером некого модуля, подключать и его глобальные переменные.
(я опустил #ifndef, они есть)
http://ideone.com/3YIgqa
Естественно, я получаю залупу за воротник, т.к. объявление переменной происходит 2 раза. И в module.c и в main.c и #ifndef тут никак не спасет.
У меня нет вариантов использовать Get\Set функции (C89 нет inline) а обращение будет часто. как уже догадались ебебедед
В итоге решил объявлять переменные в Module.с, и отдельно иметь хедер модуля объявлениями функций и отдельный с extern объявлением переменных.
Инклудить все в Module.h и его уже подключать в программе.
В то же время в Module.c только ModuleFunc.h
Лучше примером.
http://ideone.com/10EkTP
Вопрос в том, что правильный ли это вариант и единственный ли? Или я где-то туплю.
Мне не нравиться, что у меня кол-во файлов с 2х до 4х возрасло и если я захочу сохранять логичную и последовательную структуру - возрастет еще.
Не хочу иметь ModuleInternal.h какой, в котором все остальное без разбору свалено
На форумах все предлагают отдельно объявлять extern там где требуется и это звучит как залупа.
По моему я какой то хуйней заморачиваюсь, но для меня важно.
На не имеющем аналогов.
Хедер с интерфейсом или хотябы с функцией, возвращающей некий указатель, а имплеменатцию и сами глобальные переменные внутрь некого си файла.
Пользовался этим в С++, когда на С++14 сидели, экстерноговно не кушай
Нету у меня возможности использовать функцию - нет inline по стандарту, а компилятор дурной очень, не хрена не факт, что догадается разворачивать геттер.
И нет дизасм не хочу не буду смотреть
Чем extern так плохи?
>>492702
Вот заодно анону помогу.
То, что в солюшен эксплорере это файлы, которые будут собираться в объектные.
Хидеры будут игнорироваться, ты можешь их туда пихать для удобства, но программе они не будут известны.
А что бы инклудить хидеры, ты должен указать где их искать, это делается обычно
Настройки проекта -> Include Directories или что то такое, там название и место в MVS из года в год меняется.
Я наконец то получил ошибку прямым текстом, скомпилив ранее работающий проект
Хотя мне кажется что эта ошибка не имеет ничего общего с той. Короче ебаная вижуал студия. Я просто обновил ее
Не хочу линукс, говорили они. Пердолинг, говорили они
>нет inline по стандарту
тебе не нужно инлине, у тебя обычная функция самая, определение которой в трансляционном юните. Что-то в духе:
--------------
zalupa.h
int get_var();
int set_var(int val);
--------------
zalupa.cpp
static int g_var = 0;
int get_var() {
return g_var;
}
void set_var(int new_var) {
g_var = new_var;
}
--------------
За синтаксис не ручаюсь
>нет inline по стандарту
Inline не инлайнит функции. Это ключевое слово позволяет делать так, чтобы компилятор не ругался на multiple declarations одной и той же функции при инклудинге хедера, когда эта функция описана в самом хедере.
Сам инлайн только на усмотрение компилятора. Более того, даже аттрибуты типа _____forceinline_____ уже давно игнорятся компиляторами, потому что их лепят где попало.
>Вопрос в том, что правильный ли это вариант и единственный ли? Или я где-то туплю.
За именование модулей с большой буквы оторву яйца, виндоебок проклятый. Зачем тебе 2 файла не понятно. Достаточно хедера с экстернами. Но вообще это в корне неверно, но ты хочешь так.
//module.h
extern int module_global;
void ModuleInit(void);
//Module.c
#include ModuleFunc.h
int module_global;
void ModuleInit(void){
module_global = 1;//какой нахуй int здесь, поехавший
}
//Main.c
#include module.h
void main (void){
ModuleInit();
module_global++;
}
//module.h
typedef int error;
typedef struct {
int ciferka;
} module_context;
void module_create(module_context@@ yoba);
//module.c
ERROR module_create(module_context@@ yoba) {
*yoba = malloc(sizeof(module_context));
yoba->ciferka = 1;
}
//main.c
int main() {
module context yoba;
if (!module_create(yoba)) {fprintf(stderr, "Беда, капитан");exit(-1);};
}
Либо - в следующем посте
//module.h
typedef int error;
typedef struct {
int ciferka;
} module_context;
void module_create(module_context@@ yoba);
//module.c
ERROR module_create(module_context@@ yoba) {
*yoba = malloc(sizeof(module_context));
yoba->ciferka = 1;
}
//main.c
int main() {
module context yoba;
if (!module_create(yoba)) {fprintf(stderr, "Беда, капитан");exit(-1);};
}
Либо - в следующем посте
В рот ебал все это. Тупо версия qt не выбирается. И ЭТО НА РАБОТАЮЩЕМ НЕДАВНО ПРОЕКТЕ
Может быть надо пересобрать qt, либо в msvc указать старый компилятор. ЗАТО НЕТ ПЕРДОЛИНГА
//module.h
typedef int ERROR;
struct module_context_tag;
typedef struct module_context_tag module_context;//вроде нигде не проебался, ненавижу сишку
ERROR module_create(module_context@@ yoba);
//module.c
//ииинкапсуляция
struct module_context {
int ciferka;
}';
ERROR module_create(module_context@@ yoba) {
*yoba = malloc(sizeof(module_context));
yoba->ciferka = 1;
return 1;//забыл в прошлый раз
}
//main.c
int main() {
module_context yoba;
if (!module_create(yoba)) {fprintf(stderr, "Беда, капитан");exit(-1);};
}
//module.h
typedef int ERROR;
struct module_context_tag;
typedef struct module_context_tag module_context;//вроде нигде не проебался, ненавижу сишку
ERROR module_create(module_context@@ yoba);
//module.c
//ииинкапсуляция
struct module_context {
int ciferka;
}';
ERROR module_create(module_context@@ yoba) {
*yoba = malloc(sizeof(module_context));
yoba->ciferka = 1;
return 1;//забыл в прошлый раз
}
//main.c
int main() {
module_context yoba;
if (!module_create(yoba)) {fprintf(stderr, "Беда, капитан");exit(-1);};
}
Я честно говоря запутался. За что вообще отвечает msvc. Еще странно, что все работало на 19 версии, но после какого то обновления сломалось. Поможет ли, если я снесу все и заново установлю?
Ты обновился с 2017 на 2019? Для 2019 нет предсобранного msvc компилятора в Qt. Ставь 2017 build tools через установщик/настройщик студии, тогда будет валидно.
Вообще нужно приучить себя не обновлять виндовые приложения сразу. У меня однажды сама винда полетела после своего же официального обновления
я бы на твоем месте вообще не пользовался студийным тулчейном в твом случае. Накати mingw через QT инсталлер, и пользуйся им.
Ну или полноценно девелопи в студии с qt tools.
Qt tools установлены
> Это ключевое слово позволяет делать так, чтобы компилятор не ругался на multiple declarations одной и той же функции при инклудинге хедера, когда эта функция описана в самом хедере.
Интересно надо будет почитать, всегда считал что как рекомендация к развертке работает.
>>492712
Я к тому и пишу, есть шанс что конкретно мой тупой компилятор ее не развернет.
А мне очень желательно, что бы просто была изменена ячейка памяти, без джампов.
И сейчас все таки посмотрел дизасм - хуй, не разворачиваются геттеры из одной команды.
>>492719
>>492725
>malloc
Out of memory лол
Это вся хуйня в контексте байтоебства, я в начальном посте написал, мне нужно получить прямое обращение к ячейки памяти, на выходе.
Я люблю в хедере описывать дефайны и тайпдефы, после чего инклудить их в *.с и его же инклудить в проект.
Это разве нихуя не правильный подход?
>>492725
Вот конкретно тут, у тебя тайпдеф в хедере, но этот же тип используется в .с файле, куда хедер не заинклужен.
Оно на хуй не должно послать разве?
>//какой нахуй int здесь, поехавший
Опечатка же
> Это ключевое слово позволяет делать так, чтобы компилятор не ругался на multiple declarations одной и той же функции при инклудинге хедера, когда эта функция описана в самом хедере.
Интересно надо будет почитать, всегда считал что как рекомендация к развертке работает.
>>492712
Я к тому и пишу, есть шанс что конкретно мой тупой компилятор ее не развернет.
А мне очень желательно, что бы просто была изменена ячейка памяти, без джампов.
И сейчас все таки посмотрел дизасм - хуй, не разворачиваются геттеры из одной команды.
>>492719
>>492725
>malloc
Out of memory лол
Это вся хуйня в контексте байтоебства, я в начальном посте написал, мне нужно получить прямое обращение к ячейки памяти, на выходе.
Я люблю в хедере описывать дефайны и тайпдефы, после чего инклудить их в *.с и его же инклудить в проект.
Это разве нихуя не правильный подход?
>>492725
Вот конкретно тут, у тебя тайпдеф в хедере, но этот же тип используется в .с файле, куда хедер не заинклужен.
Оно на хуй не должно послать разве?
>//какой нахуй int здесь, поехавший
Опечатка же
В догонку, мне не нужна переменная в main, она мне нужна в других модулях, которые будут на основе этого.
И очень удобно иметь один ебучий хедер, который ты пихаешь куда надо.
Макароны? Безусловно, но лучше чем видимые везде, тут хотя бы видишь что используется.
>Я люблю в хедере описывать дефайны и тайпдефы, после чего инклудить их в *.с и его же инклудить в проект.
>Это разве нихуя не правильный подход?
Нормальный подход
>Вот конкретно тут, у тебя тайпдеф в хедере, но этот же тип используется в .с файле, куда хедер не заинклужен.
>Оно на хуй не должно послать разве?
У меня дохуя опечаток, это одна из них
>>492763
>И очень удобно иметь один ебучий хедер, который ты пихаешь куда надо.
В хедере extern'ы, то есть декларейшен, в соответствующем модуле - дефинишены без экстернов. И все будет работать. Так ине понял зачем тебе делить хедер на два.
>И очень удобно иметь один ебучий хедер, который ты пихаешь куда надо.
Пока не окажется, что ты у тебя два шаговых двигателя вместо одного, а код весь жестко забит на глобальные переменные, и вот тут и начинаются макароны.
Впрочем, у меня задача была показать тебе разные способы, а не выбирать их за тебя.
>была показать тебе разные способы
Я учел на будушее, спасибо.
>>492766
>В хедере extern'ы, то есть декларейшен, в соответствующем модуле - дефинишены без экстернов. И все будет работать. Так ине понял зачем тебе делить хедер на два.
Но если h инклудится в c, где объявление переменной, получается.
extern int var;
int var;
И тебя посылают на хер. Разве не так?
>Пока не окажется, что ты у тебя два шаговых двигателя вместо одного, а код весь жестко забит на глобальные переменные,
Это хороший пример, но оно слишком абстрактный, от ситуации подобное можно и через создание экземпляров и через макароны и через коллекцию.
Но это уже оффтоп.
>И тебя посылают на хер. Разве не так?
Нет http://ideone.com/EUF2w6
>Это хороший пример, но оно слишком абстрактный, от ситуации подобное можно и через создание экземпляров и через макароны и через коллекцию.
Почему, все конкретно.
Глобальные переменные не используем. Вместо них создаем контекст модуля и таскаем его. Желательно этот контекст спрятать в .c файле, чтобы наружу торчал только указатель. Это best practices сишного кода.
Исключения следует делать только в случае совсем хардкорного байтоебства, и то, не факт. Потому что вместо malloc можно и статически контексты модуля повыделять, и тогда оверхеда не будет вообще, зато при желании ты сможешь делать несколько экземпляров модуля, что нужно намного чаще, чем ты думаешь.
С другой стороны какой-нибудь Quake написан примерно в твоем стиле, и ничего.
>Нет
И в правду. Вот тебе и домыслы... тогда все понятно.
В этом месте вопрос и решается.
> все конкретно.
Ну смотри если у тебя устройство с одной лампочкой, модулем связи и 2мя шаговиками, под которые надо либу еще писать.
Легче попросту замакаронить, т.к. объем мелки и как не старайся, сделать криво и непонятно - сложно.
Или
>совсем хардкорного байтоебства
Что собственно и мой случай - слабое устройство, в которое напихали аки в японское метро и еще хотят.
>статически контексты
Остальное так и сделано правда через жопу и все один хер жестко прибито, просто конкретно этот модуль - удобнее сделать так, т.к. она один из немногих нужен везде и часто, поэтому и вопрос по скорости.
Компилировать все ссылающиеся на класс файлы vs компилировать только .cpp-файл.
Хм, что же выбрать?
Я не понимаю, run разблокировывается сразу после асинхронного вызова handler или всё-таки дожидается выполнения handler и только потом разблокировывается?
У меня есть лист и два итератора. Мне надо поменять местами значения на которые они указывают ( в листе), но если использовать swap, то итераторы инвалидируются. Надо это выполнить без инвалидации за О(1). Говорят, можно использовать как-то splice, но как?
>то итераторы инвалидируются.
С чего бы? Ты не итераторы меняешь, а значения, на которые они указывают.
А если вместо передачи handler у меня yield[ec]? Т.е. переключение на корутину. Сначала выполнится корутина, а потом run разблокируется? По тестам вроде так, я ставил задержки внутри корутины и смотрел по логам в консоль, что вызовется первым: печать после задержки внутри корутины или печать после вызова run. Типа
boost::spawn(io_context, lambda); // внутри лямбды вызывается sleep и log
some_async_op(..., yield[ec]);
io_context.run();
log(...);
>Я люблю в хедере описывать дефайны и тайпдефы, после чего инклудить их в .с
А я люблю в хедере описывать дефайны и тайпдефы, после чего инклудить их в .с. Каждый день я хожу по проекту с хедером и собераю в него все дефайны которые вижу. На два полных файла целый день уходит. Зато, когда после тяжёлого дня я открываю main.c... ммм и сваливаю в нее свое сокровище. И запускаю компилятор представляя, что меня поглотил единый организм дефайны. Мне вообще кажется, что дефайны, умеют думать, у них есть свои семьи, города, чувства, не меняйте их на шаблоны, лучше приютите у себя, говорите с ними, ласкайте их…. А вчера в ванной, мне преснился чудный сон, как будто я нырнул в море, и оно прератилось в дефайны, рыбы, водоросли, медузы, все из дефайнов и тайпдефов, даже небо, даже Аллах!.
> boost::spawn(io_context, lambda); // внутри лямбды вызывается sleep и log
перед sleep и log внутри лямбды есть yield, разумеется
Я понял. Не отвечайте.
Этот отдельный хедер звали config.h
Погуглил как делать серваки, чаще всего предлагают писать свои сокеты/хендлеры с нуля.
Погуглил "готовые решения", нашел это https://github.com/etr/libhttpserver#introduction
Теперь сомневаюсь в своей затее, веб-сервера не особо популярны на плюсах?
Может кто-нибудь сможет подсказать как мне лучше начать в этом направлении писать?
взять писать без задней мысли прошу не советовать
если у тебя разные обработчики для твоих ошибок - то да, иначе нет
Почему бы и нет, но нахуя столько бойлерплейта
Если в кьют умеешь то бери их сокеты, повторяй примеры из документации и всё. Если хттп сервак надо - на гитхабе пару либ готовых, qhttpserver например, эхо сервер в строчек 30. Но вообще да, серваки на плюсах не очень популярны судя по всему.
> Почему все до сих пор пишут классы в С++, разделяя хэдер и реализацию?
Это удобнее и понятнее.
Да
Да тоже пизди всякие модные слова без перерыва, и все будут охуевать и думать "как стать таким же умным, как ты"
че за дрыщ ебаной, у нас таких на заводе мужики байтоебы пиздят с ноги
Прсрись на форумах пару лет, почитай срачи. Будешь рожать подобное борщехлебное дерьмо тоннами.
>запретить стрелять себе в ногу
>запретить
Идите на хуй со своими запретами, авторитарные макаки.
Серьезно, помогите. Попробоваль сразу после ввода вставить проверку if(std::cin.failbit) так она при любом вводе срабатывает .
Хотя тут понял, где обосрался.
Но все же как выдавать ошибку, если на ввод подается больше 1 символа не ясно.
Читать строку целиком (getline) и потом проверять, что она из одного символа и т д.
Если у тебя есть conio.h, то можно getch() - она в принципе не даст больше одного символа ввести.
>строчной, заглавный цифра
isalnum()
Лучше не быть таким. И думать в первую очередь, как сделать без шаблонов.
const auto &ref = create_some_rvalue();
Дружок-пирожок, клуб безработных педиков парой тредов выше. Я трудоустроенный высокотестостероновый натурал.
всегда, до конца скоупа.
{ // все ок
const int& var1 = something();
something2(var1)
}
const int& func()
{
const int& var2 = something();
return var2; // висяк
}
[code]
template <class T>
struct MyBase
{
using my_t = T;
}
struct MyChild : MyBase<int>
{
// приходится писать так
using my_t = typename MyBase<int>::my_t;
}
[/code]
Раньше в vs 2017 в наследниках можно было не писать эту простыню.
Алсо, почему теперь нельзя написать [code]using T = T[/code]?
Так, собственно, конкретизировать и нечего по сути. Был древний код как в примерах, при попытке собрать новой студией с /std:c++17 вылазят ошибки номер хуй C2386 во втором случае и что-то вроде unknown identifier в первом
>пук
Никто и не ожидал, что у зашореных цппшников найдутся оправдания уёбищности этого говна. Но ты хотя бы мог отправить меня в раст-тред. Из этого треда _всех_ нужно отправлять в раст-тред. А ещё лучше попросить Абу сделать редирект
Я всем говорю, что инженером работаю. Тянки боятся, память течёт. Если бы на джс писал, то было бы стыдно смотреть в зеркало по утрам.
>Если бы на джс писал, то было бы стыдно смотреть в зеркало по утрам.
корчил бы в зеркало ахегао и складывал бы руки в кошачьи лапки
попроси, зачем срать то пришел. Насрать себе в штаны можешь
>Нахуя хвастаться скоростью, если всё равно все пользуются умными указателями а не сырыми
В огороде бузина, а в киеве дядька. Если ты подразумевал, что умные указатели медленные, то это не так.
>Нахуя вызывать деструктор по типу указателя, если ясно что память помечёт
Что
>Нахуя вводить лямбды если с безопасностью пиздец
Хотя бы чтобы делать parallel_for без плясок с бубном
>Что за уёбище получилось в итоге
Сказал растоебок, у которого язык уже сравним по уебщиности, хотя ему 10 лет всего.
>>493616
В оппосте есть ссылка "вместо шапки". Зайти туда. Найди параграф "памятка ньюфагу". Прочитай 5-й пункт.
>Сказал растоебок
С чего ты взял? Я на с++ уже 5 лет. До этого на Сишке и ObjC. И что бы вы думали? Несмотря на смартпойнтеры позавчера поймал сигфолт. Дело в том что с++ это механизм из говна, смазанный поносом. И если есть возможность пресекать хотя бы часть фейлов на этапе компиляции, то это просто космические технологии по сравнению с с++
> Несмотря на смартпойнтеры позавчера поймал сигфолт
> с++ это механизм из говна
Механизм из говна тут не c++
> std::function<void(GLFWwindow✡, int, int)>
равняется функции со второго пика.
Также внутри первого метода есть вызов функции glfwSetFramebufferSizeCallback, которая принимает в качестве аргумента указатель на функцию вида
> void(GLFWwindow✡, int, int) То есть у меня std::function на нее ориентирован
Но почему-то, когда я передаю функции glfwSetFramebufferSizeCallback ссылку на std::function ее вида, то все нормально. Как такое вышло?
На месте.
Я бы на твоем месте извинился.
Анон, эта книга для настоящих профессионалов, не пали годноту быдлу.
Как сделать заебись? Чувствую себя умственно отсталым.
Бампну вопрос, может есть какой-то способ сделать 2 окна активными?
Кек, решил в уме минут за 6, похоже брутфорс эффективнее :)
В алгоритм не вникал, но можешь попробовать вместо map использовать std::array<int, 128>
>>494107
Брутфорсы разные бывают. Для ускорения перебора нужно как можно раньше понять, что мы идём не туда и игнорировать эту ветку.
Например в этой задаче можно поддерживать множество "занятых" цифр, а также идти с конца и смотреть подходящие варианты по последней цифре.
http://ideone.com/TocGUa
Закодил вашу хуйню за час где-то. В школе занимался олимпиадами, но за прошедшие 8-10 лет деградировал до уровня двачей
template <typename T>
void print(T v){
cout <<v<<endl;
}
Мне казалось что с чтением тоже можноtemplate <typename T>
T read(){
T s;
cin<<s;
return s;
}
Но тут то я и соснул хуй когда дальше пытаюсь сделать
string s = read();
кресты я изучаю где то 20 минут, до этого писал на питоне и похпе, поэтому вопросы наверное максимально глупые
> cin<<s;
лол
Просто во втором случае конпелятор не может вычислить тип Т.
Пиши s = read<string>();
Ну я же говорю, только 20 минут как начал. Почему то в Википедии такие простые штуки при работе с шаблонами не объясняются, но скорее всего я просто в глаза ебусь привыкнув к пхп.
Cin устарел, да?
Просто взять и писать на плюсах нельзя, возьми почитай Прату, сделай примеры, а потом вернись к своей хуйне. Это тебе не питон, тут даже хеллоуворд может не компилироваться.
Я задал вопрос и получил на него ответ, но спасибо за жалкую попытку самоутверждения, было забавно
>>494259
Я вот подумал, что вам будет не очень интересно, поскольку я школьник, но сегодня писал олимпиаду и почувствовал разницу в скорости написания кода на питоне и плюсах. Мне также показалось что плюсы тяжелее читать. Как же обидно когда алгоритм в голове составил, а записать нормалтно не можешь
Нихуя себе откровения, на языке тс динамической типизацией и высоком уровне абстракции из коробки писать проще! Охвау
А как научиться переносить мысли из головы в код как можно точнее? Где задачи на эту тему взять? Потому что я такую хуйню написал что пиздец
это же какая-то ебонутость сиплюсов.
можно же (не пердоля ничего остальное даже) препроцесором генерировать отдельный файл имплементации для методов, которые не нужно инлайнить, и конпелировать всё по-нормальному, а в процессе написания держать все в хедерах, чтобы не ебать мозги несколькими файлами, иметь комменты для функций рядом с кодом, не ебать себя повторением хедеров функций в двух местах, не ебать себя переключением между хедером и имплементацией. все нормальные текстовые редакторы поддерживают сворачивание кода, поэтому "загленул в хедер сразу все увидел" не аргумент.
ухожу на раст.
>он думает, что я человек своего слова и действительно уйду на раст
Приятно видеть, что кто-то еще не потерял веру в людей.
Во многих языках есть модули. Не нужно отдельно писать интерфейс и реализацию, достаточно скомпилировать модуль, а затем его импортировать в своей программе. Ничего никуда не инклудится, всё компилится по отдельности. Хорошо это или плохо, думай сам.
Ну да, пожалуй удобно.
>Алсо, почему теперь нельзя написать [code]using T = T[/code]?
Внутри MyBase? Потому что https://timsong-cpp.github.io/cppwp/n4659/temp.local#6:
> A template-parameter shall not be redeclared within its scope (including nested scopes).
>В каких конкретных случаях создание ссылки продлевает жизнь объекта?
В ньюфаг-тред, шагом марш.
Спасибо. Кажется, нашёл статью, где они это "починили"
https://blogs.msdn.microsoft.com/vcblog/2017/09/11/two-phase-name-lookup-support-comes-to-msvc/
Создаю файл заголовка и в нем описываю класс. В классе есть один метод.
Создаю файл с кодом, в нем описываю метод.
Все ок.
Создаю класс. Обращаюсь к методу. Вижу ошибку "неопределенная ссылка к 'методнейм' " (undefined reference to 'classname::methodname')
Переношу определение метода в файл заголовка - все работает.
Что за хуйня?
Ты просто макакен-ооп-плюсовик. Я все из написанного понял и в целом согласен
Лаба что ли? Идешь циклом по списку и делаешь push_back в новый список элементам, удовлетворяющим условию.
Если не лаба, то чем тебя стл не устравивает.
Куда копировать? Список - это же не массив, там данные рандомно в памяти расположены и связаны указателями.
Да я уже загуглил. Вопрос еще один: http сервер не хранит состояние, мне нужно передать юзеру адрес второго сервера, который будет посылать уведомления об обновах, а юзер будет их с мейн сервера забирать?
ну или там не линкуеш её че там еще в плюсах.
у кого-нибудь шишка зачешется выебнуться и меня обязательно поправят.
Копируешь каждый элемент списка и связываешь их в том же порядке.
>Куда
Выдели память в куче и туда и копируй, что ты как маленький.
Используй вижуал студию, будет думать за тебя
>Кажется, нашёл статью, где они это "починили"
Там запрет переопределения параметра шаблона в планах на будущее
> Here’s a list of what’s left to come in future updates to MSVC in Visual Studio 2017...
> ...
> 5. Neither redeclaration of template parameters and redefinition of template function arguments as local names are reported as errors.
>Посоветуйте книги по Winapi
Книги по винапи у нас дома есть.
Книги по винапи дома:
https://xcb.freedesktop.org/tutorial/
Зачем по винапи писать книги? На MSDN и так все расписано с примерами. Если хочешь углубиться в архитектуру оси, то читай Windows Internals 7 часть, 1 книга уже вышла, вторая будет после нового года.
Хотя понял
Сколько ты зарабатываешь, анон?
Никто на нем не пишет, в этих итт тредах мы просто траллим нюфагов.
Если ты не заметил, то все пришедшие с лабами на якобы с++ в разделе реально используют из крестов только ввод/вывод, остальное все - чистейший си.
Двачую, за растом будущее
Попробуй что-нибудь большое написать на си. (Или просто разобраться в кодовой базе FFmpeg)
Все ФП веруны, что обсирают ООП (и в особенности крестовый недоООП), просто не пробовали что-то большое делать на чисто процедурном языке.
Нет-нет, при хорошей архитектуре, не сложно. Суть вот в этом "при".
С - ад для архитектора. Плюс ещё сырые указатели. (сегфолт, сегфолт... протечка)
Си++ лучше Си в плане выразительности, но ты ещё и не платишь за то, что не используешь. Лучшее из двух миров. На словах.
Потом можно сказать, что нахуй С, я возьму C#. А в требованиях проекта - кроссплатформенность + быстрота. И тут уже можно пососать хуйца. (А можно и не пососать. От опыта, наверное зависит.) Плюс, C# - это вендор-лок. Ну или был им до недавнего времени.
А потом можно сказать, что мы напишем нагруженные части на С, а сложные на С#. И тогда вся комманда получает тонны ебли. Такой, что дома ебаться уже и не хочется.
ИМО, не обоссывайте.
Сука. За что /code выпилили? Это же как суп ножом есть.
еще хуже (я так и не выучил толком си так что думаю что еще хуже)
в основном
typedef struct {.....} xynta
только линкед лист делал структурой
typedef struct node {.....} node
Везде, где требуется высокая производительность, используются плюсы. На нем пишут движки браузеров, виртуальные машины и т.д.
Инкапсуляция делает код более читабельным, есть шаблоны, которые иногда упрощают жизнь, есть защита от дурака в виде модификаторов доступа, всякие удобные штуки вроде перегрузки операторов, референсы и т.д.
>>495536
>просто не пробовали что-то большое делать на чисто процедурном языке.
C++ очень часто используют без RTTI, ибо оверхед, это недо-ООП и скорее ближе к процедурному программированию с синтаксическим сахаром в виде инкапсуляции, чем к тру-ООП.
Понял. Я имел в виду, прятал (инкапсулировал) ли ты детали реализации структуры в сурс файле, или нет.
>>495565
> C++ очень часто используют без RTTI, ибо оверхед, это недо-ООП и скорее ближе к процедурному программированию с синтаксическим сахаром в виде инкапсуляции, чем к тру-ООП.
Йеп. Но чистая сишка ещё страшнее, не?
И зачем нужет RTTI? Нужно просто сделать хорошую архитектуру, с чёткими интерфейсами и прочим.
>И зачем нужет RTTI?
Чтобы работали виртуальные методы. Без виртуальных методов нет полиморфизма, а без полиморфизма нет ООП. Без RTTI C++ это процедурный язык.
>Но чистая сишка ещё страшнее, не?
Да, поэтому C++ и используют.
Это был сарказм, btw.
V-тэйблы же работают без RTTI? Или я что-то путаю?
Имеется в виду вообще весь механизм, или же доступная программисту часть?
Если что, всё моё понимание RTTI составлено из вот этой статьи в википедии и опыта работы с самописной динамической идентификацией типов в одной компании.
https://ru.wikipedia.org/wiki/Динамическая_идентификация_типа_данных
Знакомый забашлял бабла в GeekBrains и пошел туда на курсы, в конце там еще и сертификат дают. Насколько хороша эта тема? Профит будет?
Конечно будет. Ложное чувство получения знаний и поднятие морального духа. А мог бы просто книжку прочитать
Так есть хоть какой-то профит от подобных курсов при трудоустройстве? сам планирую пойти Сертификат роль сыграет?
>Так есть хоть какой-то профит от подобных курсов при трудоустройстве?
>C++
Нет, это скорее минус.
Сомневаюсь что это решающую роль сыграет. Как на собеседовании себя покажешь, такой и будет результат, это максимум небольшой плюс будет. Всё-таки это не MIT какой-то, а отчесественная хуйня для выкачивания денег.
RTTI это же про typeid и dynamic_cast. Виртуальные таблицы и без них спокойно работают.
Мимопроходил
Погуглил сейчас, да, ты прав.
использование умных указателей (из стандарта) вообще не влияет на скорость выполнения по сравнению с сырыми, есть небольшие затраты на память и все
лямбды в с++ - это просто синтаксический сахарок в языке, в случае когда нужно на один раз передать callable сущьность, те чтобы не писать функторы и обычные функции для одноразового применения
Херасе.
Я пытаюсь по умолчанию везде пихать юник, а потом мне всё равно приходиться переделывать на шаред.
Могу сказать наоборот: в 99% юник не нужен.
Постоянная необходимость в Big 5 и вероятность object slicing'а дружно смеются мне тебе в лицо.
напиши "свободную" функцию фильтрации которая принимает список который нужно отфильтровать, условия фильтрации, а возвращает новый список, в котором будут отфильтрованные элементы
Попробуй дизайнить механизмы владения получше. Или, вообще хотя-бы пытаться думать, что у тебя и чем должно владеть.
Пихать всюду шаредпоинтеры, потому-что ты не знаешь, как у тебя что и где - это нихуевый такой антипаттерн и code smell
Мда, за километр видно, что у тебя память течет в проекте. В расте твой говнокод даже не скомпилился бы и ты бы рыдал как побитая шлюха над ошибками борроу чекера, размазывая сопли по щекам.
>>495779
Сука, до сих пор блевать тянет от rule of five, особенно после раста, где от этой хуйни сознательно отказались и конструкторы простые как слеза младенца.
Ты просто не умеешь готовить value семантику
кстати, ffmpeg всегда приводят в пример того, что архитектура этого проекта требует ооп-методик (в частности как динамического, так и статического полиморфизма)
но он написан на си, и в этом проекте, по сути, возможности ооп эмулируются средствами си
>тру-ООП
Это какое такое? То, где все заканчивается срачем на тему "как я выбирал свой любимый паттерн из GoF?"
если хочешь учится за деньги (на русском языке) - то 4 курса по с++ на курсере от яндекса оптимальный выбор на данный момент
Да забей, я долбоеб с лабами.
Буст это набор библиотек под разные задачи, а не одна библиотека.
А тебе зачем? Там много такого, что тебе уже не пригодится, потому что уже есть в стандарте. Читай примеры по интересующим библиотекам, типа gil, hana, geometry
std::ifstream input;
nput.open(temp);
if (!input.is_open()){
std::cout << "error: Could't load \"" << temp << "\"" << std::endl;
return 1;
}
Файл input0.txt лежит вместе с main.cpp и CMakeLists.txt, но якого-то хуя не открывается, IDE CLion, хз почему и как фиксить, хелп
Всё, проблема решилась - CLion помещает сборки в отдельную папку
при такой инициализации все, что не указано, будет zero initialized, включая, собстно, последний элемент
Лучше сделать вебапп на питоне который тягает твою либу на крестах. А так зависит от задачи. Qt самый универсальный вариант, но для венды можно подумать
Юниксвей - просто, композабельно, доступно с кучи клиентов
Даже архитектура твоей либы будет скорее всего продуманней стандартного button1click
Qtquick
Шаред не бесплатный и вообще хуита, ногу отстреливает. Юник заебись, везде юзаю, брат жив.
Если грамотно использовать шаред (а именно - не тягать счетчик ссылок постоянно), то он почти бесплатный и не хуже юника.
А так 90% случаев покрывает банальный std::vector, а еще 9% - другие контейнеры. Не так уж указатели в современном С++ нужны.
если грамотно использовать юник, шаред вообще не нужен
>я отвечаю за качество продукта
>написал крашащуюся хуету – это не я, это язык!! Язык говно просто!
Короче, есть умный указатель shared_ptr<Data> data;
есть некоторый класс, который должен работать с этим data , он хранит некий указатель mdata. Но при этом этот класс не должен захватывать указатель data: если data будет уничтожен, то mdata должен обнулиться.
Если mdata сделать shared_ptr, то он просто увеличит счетчик и не даст уничтожить указатель в data. мне это не надо.
Мне надо именно чтобы mdata становился нулем, когда data уничтожается.
Как? weak_ptr? меня просто задолбало в гугле что про weak_ptr все как попугаи тявкают про перекрестные ссылки, вместо нормальных вещей. Не понимаю (да, я дурачок)
при копировании класса все mdata этих классов должны указывать на data (но да, эти классы тоже не должны увеличивать счетчик data, и если data обнулился, то все mdata тоже должны обнулиться)
То есть задача такая - класс Foo получает указатели на методы классов, которые потом вызовет через оператор () (ну некий вариант келбэка... точнее это реализация slot and signal).
При этом этот класс не должен захватывать сам класс, чей метод он хранит (я не хочу наследовать классы - лишние действия если можно без, просто написав как-то так = bind(foo, Foo::bar).
Если делать всё через голые указатели, то возникает проблема - если класс удален, то Foo начинает вызывать метод невалидного класса.
С другой стороны если Foo будет хранить shared_ptr на класс, то тогда класс нельзя будет удалить, его метод все равно будет вызываться.
если сделать ручную отвязку... ну ручная отвязка же, это как удалять память в ручную - забыл и потекло.
Ну и короче в Foo нужен такой умный указатель, который не увеличивает счетчик ссылок. а в случае когда класс удаляется, обнуляет свой указатель
std::weak_ptr<Type> t;
typedef void(Type::Func)(Args ...);
void operator()(Args ...args) const noexcept final {
if (t.lock()){
(t->f)(args ...);
}
}
не работает, выкидывает ошибку на *f
мля, какой дебильный парсер двача. да еще и пастебин сдох
Короче, пикча
выдает ошибку, нельзя указатель на функцию (я не ебу зачем и почему - делал по гуглу)
а оператор копирования разве не затрет указатель Data() при yoba.mdata = data.mdata;?
но вообще у меня вроде получилось и через weak_ptr...
Хотя вот интересно, а weak_ptr::lock слишком тяжелая операция,
хм, надо посмотреть
Поищи скрытый конструктор shared_ptr на хабре
Если есть способы минимизировать риски, то глупо ими не пользоваться
ну смотри: если ты не используешь sharep пойнтер, то тебе самому надо будет делать подсчет ссылок руками, те по затратам на скорость исполнения все равно так же будет
Можно написать сборщик мусора
дык и используй weak_ptr
в чем проблема?
или ты не понимаешь механизма его работы?
вкратце, он не проверяется на "нулевость", а становится невалидным
а чтобы с ним поработать, нужно получить из него shared_ptr, и, если он не валидный, то этого не получится сделать..
так с ним и работают..
у тебя типичная задача для weak_ptr, только, подозреваю, ты не понимаешь как с ним работать..
Короче weak ptr использовать можно, но без make_shared, иначе смысл теряется
./a.out --option 1 2 --option 2 -3 --option -3 +4 (тут именно через пробелы)
возвращало
std::vector<std::pait<int, int>>
Можно ли это сделать без большой ебли, или проще передавать значения в виде --option 1:2 и руками разбивать и разбирать?
>иследовательскую работу в анрил энжине
Это как это вообще?
Будешь открывать доселе невиданные возможности УЕЧ?
при том, что сам в нем не бум-бум, лол
Российское образование, такое российское...
Я предполагаю исследование для самого себя
И все-таки есть что-то посоветовать?
Какую либу для сокетов-хуёкитов посоветуете? Я писал беркли сокеты на Си, но они несовместимы с виндой (да, я линуксоид).
И вообще, как плюсы для сетевого программирования? Или лучше другой язык юзать?
P.S.: пиздон слишком медленный для этого, имхо, поэтому не предлагать.
Вроде как то можно писать на Беркли в винде с помощью костылей, но я не уверен.
А так у винды свои сокеты, их и гугли.
boost.beast, boost.asio, QtNetwork проще всего, для http - C++ REST SDK от мелкомягких. Первые два низкоуровневые, на них писать не очень приятно, кьют я лично использую я студент мне нравится, если кьют освоишь то вообще заебись будет, последний не использовал, но рекомендовали сеньоры-помидоры в чатах, говорят мол заебись.
poco библиотеку ещё можешь чекнуть.
Винсок - калька с беркли
>Задача сложная?
Нет, задачи интересные, это мой недосып виноват.
На самом деле я очень рад, что смог найти работу с гибким графиком и хорошим коллективом.
Только без рофлов, какие возможности трудоустройства есть в 2к19, зная плюсы?
Что пишут, что НЕ пишут? Сетевые приложения пишут на плюсах? Заранее спс
пишут дохуя всего, включая сетевые приложения. Если ты прям хочешь вкатиться в плюсы - задрочи алгоритмы и иди в яндекс. Ну или научись сосать хуй и иди в мейлру. Потом перекатишься в нормальное место
> че читать что-бы начать разбираться?
Открой демки УЕ4 и по ним разбирайся. Куча материалов и демок в инете, гугли. В блюпринтах ничего сложного нет, кроме того, что вместо 10 строчек кода, ты лепишь мышкой паука на два экрана. Это простой скриптовый язык с ООП. ВР приложения от обычных фактически ничем не отличаются. То есть ты можешь любое анриловское приложение запустить в ВР режиме, и оно сразу заработает. Самому придется только работу с контроллерами делать. С 99% вероятности С++ тебе не понадобится - почти все делается блюпринтами. С крестами там тоже ничего сложного, кроме того, что у них там свой препроцессор и своя система сборки на шарпе, в результате чего все очень неспешно компилируется.
Самый большой гемморой будет, если вы нацелитесь на мобильные устройства вроде Oculus Go/Quest. Там мало того, что сам анрил для мобилок не очень припособлен (куча ограничений, куча багов годами висят), так еще и пидоры из фейсбука могут сломать API в любой момент, так что все снова заработает только в следующей версии УЕ4. Самсунг так вообще поддержку дропнул для своих очков. Теперь чтобы с ними работать, надо какие-то древние версии анрила качать. Короче, лучше не связывайся с мобилками или приготовься тушить жопу регулярно.
>Российское образование, такое российское...
Сейчас, бум всей этой ВР поеботы в образовании. Не только в РФ, на западе тоже. С игрушками все умерло, а университеты, наоборот, грантов набрали и лепят все подряд в ВР.
шо поделаешь
технология есть, а человеческий организм не принимает..
некоторые люди блюют после сеанса vr в шлеме, у многих болит голова, болят глаза..
по итогу в продакшон это худо проталкивается, остается только допиливать гранты в вузах
Чтобы быть крестомакакой в 2019 и получать синьёрские 75к, тебе придется выучить qt+boost, уметь пилилить фронт на реакте и бэк на голанге. Такие дела.
Это все дело привычки, причём недолгой. Основная проблема вр это хуевое железо и софт. Потому что аджайлоебы не могут в хардваре
Бля, где вы такие вакансии находите вообще. Глянул что в моём городе по мидлам-сеньорам, вот первое что попалось, вполне адекватные требования и зарплата в 3к, что для моей страны практически равнозначно богу, который может позволить всё.
ты же понимаешь, что это вакансия работает в 2 случаях:
1) студент без опыта, который просто хочет жрать. наверняка ему еще и зп уменьшат раза в 2
2) какой-то старый пердун, который уже впринципе не можем/хочет ничего нового учить
толковые крестоебы идут только на норм отлату, или съебуют за бугор или просто перекатываются в тот же энтерпрайз
// мимо жава макака
А что не так? Qt - это язык, транслирующийся в С++ программой moc.
>2) какой-то старый пердун, который уже впринципе не можем/хочет ничего нового учить
Хотел бы я посмотреть на фуллстак старого пердуна на реакте и голанге.
если реально нужен с++ - то возьмут и старого пердуна, который только с++ и знает. в придачу к нему поставят студента-зумерка
старые пердуны не знают С++, они умеют месить сиговно только
студента зачем? чтобы веки как вию поднимал?
Короче, кому надо сделать систему событий (ну например когда окошко размер изменило), без всяких сложных штук:
https://ideone.com/Pz9lwn
(это еще черновое, там надо сделать защиту на случай если класс FooBla будет уничтожен (помечено todo) и скрыть уродство Connect
Переделывай. Я должен сам типы параметров функций дописывать? Почему нет поддержки типа возврата?
>>Я должен сам типы параметров функций дописывать?
В EventSignal - да, для каждого события ведь свой список (для ресайза окна, два параметра, для клавы - описание клавиши и т.д.)
>>Почему нет поддержки типа возврата?
Если там будет стопятсотслушателей, то как ты их отследишь?
Вообще этот код, это некий вариант паттерна signal and slot (который например используется в QT)
Но этот паттерн довольно абстрактен и не без проблем (например мертвые указатели)
Код сейчас переложу, там решена проблема с мертвыми указателями, да и выглядит получше
затем что:
- а) std::function очень тяжелый и тормозной (про это где-то в гугле была статья, с бенчмарками)
- б) std::bind все равно также и выглядит
- в) не обрабатывает ситуацию, когда класс метода будет уничтожен
- г) все равно нужно делать обертку
- д) не по феншую
- е) чтобы нет?
Понятно, стандартное ко-ко-ко велосипедостроителя про дикий оверхед стандартной библиотеки, при чем на самом деле велосипедостроитель не знает и не понимает нихуя, но уже бежит делать свою имплементацию.
Ты сначала досканально изучи, как оно работает, изучи, где именно он тормозит и почему, и, возможно, ты захочешь сделать свой вариант под твою задачу. Но скорее всего не захочешь.
А та хуйня, которой ты занимаешься, нихуя хорошего в плане профессионального развития тебе не принесет.
а можно подробнее, я плохо владею шаблономагией,
и самое главное, что мне это даст, а то не совсем понятно зачем мне вот такие сотни строк
https://github.com/TartanLlama/function_ref/blob/master/include/tl/function_ref.hpp
когда у меня все это в одну строку typedef
https://probablydance.com/2013/01/13/a-faster-implementation-of-stdfunction/
Я на эту, как ты выразился, херню потрачу всего день, так что я ничего не теряю.
https://ideone.com/wseHBU
- теперь оно умеет чистить память от мертвых указателей. То есть если класс слушателя будет уничтожен, никаких утечек, и ошибок памяти.
- Connect теперь выглядит получше, как std::bind
- в примере показано что на мой класс слушателя можно вешать сколько угодно функций с разными сигнатурами.
Минус: - пришлось сделать макрос __EVENTLISTENERBODY.
сначала я хотел сделать через наследование от IEventListener... но тут множественное наследование, и компилятор не уверен какой Register() вызывать. даже с подсказками там серьезный варнинг
Если кто подскажет как улучшить...
>Я на эту, как ты выразился, херню потрачу всего день, так что я ничего не теряю.
А лучше бы бабу нашел. Потому что вместо всей этой хуйни с дрочем на пост пятилетней давности можно было бы набрать аж 4 комады
$git clone https://github.com/skarupke/std_function
$cd std_function
$g++ compare_functions.cpp -O2
$./a.out
std::function: 518 ms
func::function: 515 ms
virtual function: 547 ms
И пойти отдыхать. А если и учиться, то учиться правильным практикам, а не своей поебистике.
Я кстати ахуел сколько там часов лекций выложили. Как все это смотреть?
вообще даже не так.. не совсем понимаю наезда. Во-первых я не против STD (там вон даже std::list есть если что)
Просто всё должно использоваться по назначению, а не потому что круто-модно-молодежно.
Мой код написан конкретно под мою задачу - обработка событий от разных систем.
если там про std::function_ref - то он разве принят? у меня его в компиляторе нет.
А если самому писать - то как я написал выше - я пока не осилил шаблономагию завезенную С++11/С++14/С++17
>Мой код написан конкретно под мою задачу - обработка событий от разных систем.
Твой код написан велосипедостроителем, хуево знающим С++. И вместо изучения С++ (например, как написать свой std::function), он страдает хуйней.
Хз, как по мне пикрил удобней. Уверен что можно еще больше упростить код, ибо я сам не маг.
Еще раз, зачем мне писать свой std::function?
короче, давай так - ты знаешь что такое signal and slot? Ладно, даю подсказку, он основан на observer. Даю вторую подсказку - в некоторых реализациях можно использовать внутри std::function.
даю третью подсказку - я не обертку над функциями делаю, а систему обработки событий которая должна обрабатывать неизвестные события.
и знаешь в чем еще проблема конкретно твоего пикрила, вот у тебя будет класс Input в котором будет твоя function... А потом ты захочешь добавить FooB2. И? Полезешь изменять Input чтобы написать новый Prototype? это как бы нарушение инкапсуляции, и ведет к лапше.
ошибка, зачем ты создаешь несколько Signal, если он должен быть ровно один?
твои примеры, они просто про обертку над методом. Это вообще не то.
Задача такая
- классы могут генерировать события. При этом виды событий должны добавляться в любой момент без нарушения принципов ООП (то есть не должно быть лапши, добавление нового события в свой класс не должно менять другой код)
- на каждое событие подписываются подписчики (Listener). Количество подписчиков неизвестно. это может быть один, два, стопятсот.
- когда возникает событие - подписчики должны выполнить свой код. при этом, так как события разные, то и сигнатура функций будет разной (для этого и юзается Argc...)
std::function не является решением, это всего лишь инструмент через который такую задачу можно решить. Всё равно придется писать обертку потому что:
- подписчики могут уничтожаться в любое время, их срок жизни никак не связан со сроком жизни системы генерирующей события.
- нужно хранить не одну функцию, а массив - то есть должны быть механизмы добавления, удаления и обхода
- а там где-то еще многопоточность бегает - там свои сложности
- всё это еще и не должно выбиваться из общего кодестайла, так что обертка 100% будет
- если плевать на кодестайл, то не стоит плевать на проблемы STD и DLL (кто-нибудь помнит почему в DLL интерфейсах нельзя std::string а надо char*? это из той же оперы). так что всё равно обертка.
>>497724
>>497735
Короче, хватит на пальцах. Раз вы не хотите знать что такое паттерн singal and slot, то я вам покажу, почему std::function - это ни разу не оно
https://github.com/adrg/sling
(здесь используется ваш std::function)
или вот
https://github.com/NoAvailableAlias/nano-signal-slot
(но здесь велосипед, да)
Я вообще решаю другую задачу, так что... странно меня обвинять в страдании хуйней, если вы даже не поняли задачу которую я решаю.
Так ты объяснять не умеешь. Никто и не говорил, что это одно и тоже. Посоветовали использовать std::function, все остальное ты сам надумал, еще и обижаешься на нашу помощь.
ну я не вижу решение через std::function, которое было бы проще и эффективней:
- за функцию у меня отвечают две строчки которые на самом деле одна (typedef) - для этого мне не надо тянуть довольно тяжелые заголовки.
По какой причине (кроме религиозной) имеет смысл одну строку кода заменять на тяжелый заголовок?
- все одно пришлось бы делать вариативный шаблон EventSignal, потому что он должен иметь разное количество аргументов под свои события.
Ну, возможно какой-нибудь шаблономагией из C++17 это и можно было бы решить - я не знаю.
- и всё равно нужно было делать решение для ситуации когда слушатель убивается раньше обработки события.
>за функцию у меня отвечают две строчки которые на самом деле одна (typedef) - для этого мне не надо тянуть довольно тяжелые заголовки.
Неправда. У тебя класс должен имплементировать интерфейс EventResizeEventListener, и это является самой большой проблемой кода. Типичное ООП в стиле 90-х: для простой задачи с простой семантикой наворачивается какая-то ебанутая иерархия классов. Алло, я хочу просто подписаться на событие, нахуя мне этот АбстрактПроксиСинглетовЭвентРисайзЭвентЛистенер и 10005000 других классов такого плана.
А на самом деле для механизма коллбэков достаточно std::function, который делает type erasure, и тогда подписываться сможет кто угодно, даже не класс вообще, лишь бы была нужна сигнатура.
Что касается "удаления листенера из списка подписок в деструкторе", то нет листенера (а есть std::function) - нет проблем. Проблема надумана.
как ты подпишешься на событие, если у разных событий разные типы и количество аргументов?
даже через std::function нужно эту сигнатуру указывать, или покажи как можно в std::function передать функцию не указывая аргументы
>>Что касается "удаления листенера из списка подписок в деструкторе", то нет листенера (а есть std::function) - нет проблем. Проблема надумана.
Это на абстрактных единорогах,
В реальном проекте листенер - это метод класса, который работает с этим классом. например:
Widget : public EventResizeEventListener;
или ты предлагаешь писать на функциях а данные перекидывать через глобальные переменные? или как?
давай по другому
вот тебе список ивентов
keyboardHandler
mouseHandler
touchHandler
gamepadHandler
windowHandler
systemHandler
uiHandler
animationHandler
soundHandler
updateHandler
у каждого из них свое количество аргументов, у одних это две переменные, у других это один класс, а у кого-то может и вообще нет аргументов
Теперь давай без имплементации и 100500 других классов покажи мне решение...
Через ООП конечно же. Ведь те, кто должны реагировать на события - это не под типы, у них своя логика, свои члены, свои методы
>>497759
опять парадигма говно в жопу заливает?
Тебе в этой иерархии не надо ковыряться, а просто переопределить метод.
Чини детектор, пруфов не будет
Если что, у weak_ptr нет оператора разыменования, т.к. перед использованием содержимого его надо обязательно проверить на существование.
Надо делать так:
auto ptr = t.lock();
И если ptr не nullptr, то к нему уже обращаться как к указателю
ладно, переделал
https://ideone.com/7SS1k6
Теперь все классы-слушатели наследуются всего от одного интерфейса Listener. Этот интерфейс нужен чтобы оно потом в случае уничтожения класса почистило память.
С этим пока не нашел решения (напомню, на события реагируют не функции, а методы классов, так как все данные в классах. И вот эти классы могут уничтожаться раньше чем менеджер событий, поэтому нужно чтобы менеджер выкинул повисшие указатели....
Вообще эту задачу можно решить через умные указатели без наследования, но я так и не понял в каких случаях weak_ptr не дает освободить указатель, да и конструктция в итоге уродливая)
перегружать теперь ничего не надо
Нужна помощь от посвященных в плюсы
Как сделать, фоновое приложение, которое активируется при зажатии указанной кнопки, с меня как всегда
>valgrind
>AddressSanitizer/ThreadSanitizer/MemorySanitizer
>PVS-Studio, cppcheck, cpplint, coverity
>Из Rust в данный пиздят фичу lifetime analysis
>Все большие компании юзают статический анализ и санитайзеры
ВЫ ВСЕ ПРОСТО НЕ МОЖЕТЕ В НОРМАЛЬНЫЙ КОД А Я МОГУ
Сектант, плиз
А как это работает? Я думал там все эти блюпринты компилятор превращает в те же самые бинари, как если бы ты на плюсах писал и это просто фронт-енд для них.
Мимо другой
блядь абу ебаный уебок какова хуя ебучие футбольные эмоджи работают но не нормальные
но не гарантирует, что сгенерированный из блюпринтов код будет таким же, как если бы ты реализовал ту же функциональность, написав всё руками. хотя и руками ты можешь написать еботу, которая работает хуже блупринта.
Очевидно изобретает кют.
Я вот смотрю и нихуя не понимаю, в чем смысл? При как обстоятельствах у меня будет несколько разных классов с одинаковыми методами и почему я им должен слать сигнал? Я лучше вектор из каллбеков запилю.
>опыт разработки был? есть что-то из кулстори?
Периодически приходится делать простые демки в VR. Народ такое любит заказывать: походить по помещению, потыкать в интерактивные подсказки, посмотреть анимации простенькие. Анрил для этого очень удобен - все быстро накидывается мышкой, а в ВР хорошо чувствуется масштаб, особенно у всяких гигантских йоб вроде танкеров и ракет. Кулстори нет особенных.
Гораздо интереснее на какой сажают.
Бамп
ты не понимаешь сам паттерн signal and slot?
А для чего это надо? например в движках, или библиотеках гуи. Ты же не знаешь сколько у пользователя будет кнопок, может одна, может две, а может все 10500 на всё окно.
И все эти кнопки должны реагировать на события... Конечно это все может делать и виджет мастер, но в таком случае нарушаются принципы ООП - в таком случае мастеру придется знать о своих элементах слишком много... А что если нужно добавлять новые элементы со своей логикой? Этот путь - это путь антипаттернов - гудобжекта и спагеттикода.
(впрочем так тоже делают - нет же единого решения задачи)
>ты не понимаешь сам паттерн signal and slot?
Я изучил вопрос и все, что нарыл, это то, что сигналы-слоты удобны тем, что позволяют пробрасывать ООП-сообщения между тредами. Если у тебя однотредная реализация, она ничем не лучше вектора коллбэков по функциональности. Можно написать пару шаблонных функций уровня "добавить коллбэк в вектор колбэков" и "пройтись по вектору коллбэков и вызвать каждого колобка", но не более того.
А вообще эта хуйня появилась когда в крестах не было лямбд.
observer/listener? это все из одной области.
И кстати, QT тут ни при чем. Просто в QT этот паттерн юзают, но не изобрели
сигналы в бусте пришли (хм, в 2001 году чтоли?)
https://www.boost.org/doc/libs/1_63_0/doc/html/signals.html
И вроде как их изобрели чтобы в С++ завести событийно-ориентированное программирование о котором вроде уже и забыли
Эх, зумерки, для которых 2001 год - это ниибаца древность.
В 2001 году я в kdevelop изучал Qt, который к тому времени был уже довольно старым. Вот тебе пруф наличия там сигналов и слотов аж в 1998 году. Раньше не могу - https://download.qt.io/archive/qt/1/ на этой странице нихуя раньше нет.
ну ты не про то. при чем тут лямбды? Во-первых, мы пишем в ООП, то есть никаких глобальных функций.
Есть классы, у классов есть методы для того чтобы работать с членами класса (инкапсуляция, все дела)
Соответсвено какой-нибудь метод может быть реакцией на событие - например игрок нажал кнопку, значит надо вызвать метод Player::Move.
И все замечательно с твоими векторами коллбеков ровно до тех пор пока класс Player не будет удален, а затем нажата кнопка. Угадай что будет? веселый дебаг, потому что твой коллбек хранит указатель на функцию класса, когда этот класс уже давно удален из памяти
Одна из задач сигналов и слотов - уметь отключать мертвые классы.
да какая разница?
просто он лучше всего подходит для либ с гуи, где много событий, но неизвестно сколько объектов
вот есть интерфейс IClass.
От него наследован класс MyClass
А еще есть шаблонный метод <typename T> Foo(T t)
так вот. надо в Foo сделать проверку что T наследован от IClass,
Как?
На самом деле ничего, это я слепой даун.
Прости, друг, я невнимательно прочёл сообщение анона, на которое ты ответил - почему-то показалось, что ему нужен рантайм-еррор, а не компайлтайм.
B b;
a+ b; - ошибка, хотя в A определено преобразование в B
operator B() {
return B(x,y);
}
У вас нет потому что public private protected ахахах
Определил в обеих, не помогло.
Класс A не знает, как ему складываться с B. Либо определи сложение в обоих классах, либо вне классов.
У тебя для A не перегружен operator+(B). Либо перегружай, либо делай как здоровый человек operator+(A, B) и operator+(B,A) и не ебись с implicit conversion
Не понял тебя. Зачем ему это знать, если я определил для класса A преобразование в B? Да и даже если я в А вставлю это
A& operator+(A& d){
x+=d.x;
y+=d.y;
return *this;
}
Ничего не поменяется
using namespace std;
Почему? Чем лучше постоянно писать std::(нейм) ?
Спрашиваю просто из интереса, я лабы все равно на другом яп пишу.
>Зачем ему это знать, если я определил для класса A преобразование в B?
А откуда ему знать, что ему надо преобразоваться в B?
И кстати, не надо возвращать у сложение B&, ты же не собираешься писать что-то вроде
b + a = 3
Захламляет твоё пространство имён. Чтобы не возникало двусмысленности, если у тебя в коде будут функции с теми же именами.
Вообще, я даже не обратил внимания, что у тебя за странный способ сложения? a + b и так должно создавать новый объект, который ты будешь использовать в выражении, типа a = a + b. А у тебя оно с какой-то стати объект изменяет. Тебе надо было перегрузить оператор += для этого.
Вот так должно быть https://ideone.com/JRcjjp
Потому что у вас лабы, и кроме лаб препод ничего не делал. В большом проекте using будет, но будет сидеть только там, где он действительно нужен - внутри класса, функции или вообще блока кода, и не лезть наружу. Это касается не только std, а любых псевдонимов классов и неймспейсов.
Чем я хуже кошкомальчика?
Ты так говоришь, будто во всех проектах чуть-чуть больше лабы возникает проблема двусмысленности имен.
Даже в очень большом проекте двусмысленности может не возникнуть. А может возникнуть, хуй его знает, проблема как раз в том, что пиздец подкрадывается как всегда незаметно, и ты бежишь с горящей сракой менять все pizda на std::pizda.
>никаких глобальных функций
БЕРЁШ ГЛОБАЛЬНУЮ ФУНКЦИЮ
@
ЗАВОРАЧИВАЕШ В НЕЙМСПЕЙС
@
ГОТОВО, ТЕПЕРЬ НАША ПРОГРАММА НАПИСАНА В СТИЛЕ ООП
Как раз делегат ближе к std::function.
> Во-первых, мы пишем в ООП, то есть никаких глобальных функций
Ебать дебил. Посмотри последний цппкон. Там популярно объясняют, что глобальные функции нужны, и напоминают, что С++ не тоталитарная ООП помойка.
> А может возникнуть, хуй его знает
Поэтому лучше не использовать using namespace в хидерах. Так оно протечет по всему проекту. Если использовать только в cpp, то будет гораздо проще исправить столкновение имен только в одном файле.
угу, страуструп всегда писал что не надо перегружать интерфейс класса, а вместо этого, по возможности, делать свободные функции-помощьники рядом с классом, объединяя это все в одну сущньность посредством пространств имен
Я не хочу скрывать само окно, оно показывает мой рабочий стол, я хочу чтобы оно не показывалось. Прикреплю скрин, чтобы было понятнее, хочу чтобы окно вовсе не показывало себя. Могу сделать чёрный фон SetWindowDisplayAffinity(hWnd, WDA_MONITOR), но это не то, чего я хочу.
Ну передай своему окну hide перед скриншотом и разверни позже, раз уж не получается никак.
Но вообще 3 минуты гугла подсказали, что bitblt может тебе помочь.
Оно делает не 1 скриншот, а непрерывную серию (видео) в реальном времени.
auto a = [](int g){return g*g;}
как поместить ее в контейнер map, который хранит пары строка - std::function<int>?
Читать книги для нюфань скучно, справочники лениво. Что из списка в шапке подойдет для быстрого вката в современный, 14/17 стандарта, язык? Там в основном книги 200x годов, а стандарт 2011 вроде внес серьезные изменения. Взялся читать Мейерса "Эффективный и современный C++" 2015, но понял что не хватает БАЗИСА.
Нашел на scanlibs пикрил 2019 года, описываются фичи в т.ч. 17 стандарта. Как думаешь, подойдет в качестве экспресс-курса, если дополнить практикой с leetcode/codewars/etc?
>Там в основном книги 200x годов, а стандарт 2011 вроде внес серьезные изменения
Да не особо они серьезные. Основные принципы не поменялись, просто стало чуть проще их применять. Читай библиографию Мейерса целиком. Если же прямо совсем лень, читай
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md
Только для тех, кто был в анабиозе в 2003 года.
Половина фич это перетащенный в стандартную либу буст, вторая половина - синтаксический сахарок.
Разве что лямбды реально повлияли на стиль, но это тоже сахар.
Только вот в учебниках никакого буста нет. В итоге прочтет книгу по старому стандарту, откроет код, а там лямбды, перемещение, вывод типов, умные указатели и тд
>менять все pizda на std::pizda
Ебанатство какое-то. Почему нельзя новые pizda использовать как neo::pizda?
Это получается стандартную библиотеку нельзя по-человечески юзать, а всяким левым хуйням можно, лол.
Он переживает не о том, что там чего-то нет, а то, что там что-то неверное что потребуется потом забыть. А это не так.
А то что ты упомянул есть в том Мейерсе про который он писал и посчитал что базы не хватает.
В cpp файле делай что хочешь. А вот делать так в хедере это блядство, потому что ты поломаешь код, который тебя заинклудил.
Можно и так, но потом кто-нибудь въебет using namespace neo; и все пойдет по пизде. А вообще >>499015 прав, using namespace std; в сурсах вполне ок решение.
>>499168
Меня забавляют байтоебы, на каждом углу кричащие, что они настоящие программисты, а не какие то веб макаки, а потом идут писать десктоп, который не сильно далеко от уеба ушел по сложности задач.
Ничего не имею против тебя, плюсов или кьюти, я и сам в какой то мере байтоеб, просто вспомнил забавное наблюдение.
все таки QT десктоп, это кардинально иной уровень сложности, чем вебговно, как не крути. Но тем не менее, если бы я писал гуй - я бы его точно писать не крестах.
>это кардинально иной уровень сложности, чем вебговно, как не крути.
Где там сложность? Раскидал по форме элементы, написал обработчики событий -- все нахуй.
Разве что только если гуй -- это всего лишь фронтэнд к какой-то пиздец сложной логике вроде какого-нибудь компилятора или виртуальной машины, но пиздец сложную логику и в вебе можно придумать. У вас похоже представления о вебе прямиком из 90-х, когда пых использовали для счетчика посетителей на хоумпейдж.
> если гуй -- это всего лишь фронтэнд к какой-то пиздец сложной логике
Приведи пример где это не так? У меня вообще большинство десктоп приложений это обёртка над терминалом, чтобы кнопочки тыкать можно было. А веб говно потому-что там макаки вообще хуй положили на оптимизации и теперь какие-то одностраничные лендинги весят по 50мб и кушают по 1гб памяти, в десктопе на крестах по крайней мере я такой хуйни не замечал.
Прям годнота? Я в 16 году начинал читать актуальное на тот момент издание, но по какой-то причине дропнул. Ок, попробую, спасибо.
Неужели чтобы такое реализовать на ассемблере потребовалось бы такое огромное количество строк кода?
ну мапа то - дохуя сложный контейнер
Шлее о многих аспектах не рассказывает, или говорит вскользь. В целом для ознакомления заебись, считай прочитаешь ее за неделю, поделаешь примеры из нее, а дальше нужно будет садиться и писать что-то самому. У кьюта огромный плюс - охуенная документация, доступная прямо из иде, с примерами и описанием каждой функции. Как почувствуешь готовность - можешь почитать как там мок устроен, нахуя ты эти странные макросы вставляешь куда попало и почему функциям-сигналам не нужна реализация. Хотя да, кьют часто ругают и не зря, хотя и в вакансиях я его вижу относительно часто. Лично мне как студентоте было заебись написать что-то полезное, а не дрочить байты и лабы в С с классами.
> У кьюта огромный плюс - охуенная документация,
Хочу рассказать, что я делал два примера по "документации" и они нихуя не работали, поскольку в самом доке пропускали части кода, приходилось еще и сорсы примера открывать. Неудобно.
Но ты не про примеры говоришь. А сама документация как референс да, неплохая.
Ну не знаю, я код модели для тривьюхи практически полностью себе в проект впихал, и работало заебись, разве что немного модифицировал под свою задачу. Не помню такого, что код прямо не работал, разве что действительно там где-то пропускают часть кода для упрощения.
>нормальные люди пишут на winapi
да ладно
если сейчас хочешь писать для развлечения (а натив под винду для заработка уже не попишешь, нет работы), то гораздо интересней писать uwp приложение
winrt - замечательно спроектированная нативная библиотека
на винапи уже никто давно не пишет полноценные оконные приложения.
отделяй гуй от реализации всегда
просто представь, что у твоей проги будет 2 интерфейса - командной строки и гуй
те пишешь сначала ядро, из него будет торчать открытый api интерфейс
>а там лямбды,
лямбы вообще синтаксический сахарок, для того чтобы не писать свободные функции или функторы в случае когда они будут применяться на один раз..
> вывод типов
вывод типов вообще то в языке уже очень давно, как только появились шаблоны
вывод типов работал для шаблонов свободных функций и для функций-членов классов
соответственно и правила вывода типов уже тогда были и были хоть и сложными, но интуитивно понятными
и в новых стандартах эти правила во многом применимы и на вывод типа выражения (auto, deltype и прочее), те ничего особенно нового..
>умные указатели
в стандарте 98 года уже был один умный указатель, а вообще на конец 90 уже были написаны книги, половина объема которых была посвящена теме умных указателей, например книга джеффа элджера "библиотека программиста с++" (неудачное название у книги, у александреску "современное проектирование на с++" тоже не очень удачное название было)
потом была уже методика raii, которая закрывала часть задач умных указателей
и вообще, если крупно обобщить, то важнейшее семантическое изменение в языке - это появление механизма перемещения
в будущем (если язык не умрет) это сильно изменит подход к проектированию многих библиотек
а я вот из тех, кто как раз прочитал все книги майерса (просто для развлечения)
и вот самой полезной и удачной у него считаю последнюю книгу, где он обсуждает тонкости стандартов с++11 и с++14
а предыдущие книги - это, блин, такая простота на данный момент что просто даже не знаю
я бы тебе вообще не советовал изучать кресты, пиши (и зарабатывай) на том что ты знаешь
а для интереса продолжай грызть f#, он прикольный, языки ml-семейства вообще прекрасно подходят для развлечения
не очень понятно зачем тебе для этого лямбды
достаточно именованой функции, и указателя на нее помещенного в мапу
F# для развлечения я уже знаю, на работе втащить его в прод довольно сложно: в финансах все довольно консервативненько, еще и спецов на рынке мало. Я много дотнетчиков прособеседовал (ок 50 за последний год), у нескольких в резюме был F#, и знаний у всех меньше, чем у меня. Да что там говорить, даже питониста толкового х найдешь, те что меньше 200 просят нихрена не знают, а остальные как будто в ai/ml или гошку укатились
Плюсы они уже вот тут, куча либ и сервисов на работе, и несколько отладочных плат дома.
А деньги мне больше не от языков программирования приходят, а от болтовни, сроков и результатов моей команды и порядка в джире. Тимлид же лул.
не забивай себе башку еще и крестами
щас только книга по стандартной библиотеке - 1200 страниц, книга по шаблонам - 850 страниц, а там ничего особенного не написано, чисто вводные книги в тему
сам 17й стандарт - 1650 страниц, лол
нафиг тебе это надо
Бумп.
Жидбрейнс платит 200+
60
Аналогично char(0b10101010) != 0b10101010
Ты мудр, спасибо, чувак
Просто, без задней мысли.
чтото у меня ошибок навалило
error: 'chrono_literals' is not a namespace-name
error: expected namespace-name before ';' token
using namespace std::chrono_literals;
error: 'std::this_thread' has not been declared
error: unable to find numeric literal operator 'operator""ms'
Он не работает, я пробовал.
usleep принимает микро или наносекунды, не помню
>Это был плохой указатель и он ушел от нас.
хех ты даже щас и не вспомнищ чем он был плох
он справлялся со своими задачами и все
Мб он компилит ещё не под std=c++17
Ну не то чтоб плох, но до введения семантики перемещения разрушающее присваивание выглядело пиздец как странно.
>геттеры и сеттеры
>как нормальное ооп
Это же ублюдство пиздец,
В простой хуйне типа точки или вектора проще ебнуть структуру, а в каком-нибудь YobaCalculator вся логика должна быть заключена внутри объекта, чтобы тупо загнать через конструктор сеттинги какие-нибудь и дёргать его, как абстрактный черный ящик.
Там ссылка стухла первая, есть у кого?
Ребят, если интересна робототехника, а точнее программирование дронов и небольших роботов, ну и сюда же разработка их беспилотного режима, это какие языки? Питон и С++?
рую ссылку, то тебе нужно открыть вторую ссылку и посмотреть на адрес бар, а затем зайти в первую ссылку и совершить поиск полученной на предыдущем шаге информации.
>очнее
У нас в вузе такое чисто на питоне делали, мб там либы какие-то плюсовые есть уже, хуй знает.
Спасибо
http://www.cplusplus.com/reference/sstream/stringstream/
Можно извратиться используя стрингстримы. Это тоже самое как вывести переменную в стандартный выход, но ето типа стека. Т.е. загоняешь переменную в стринстрим, она им хавается и переваривается в строку, а потом высираешь это на экран.
Этой хуйнёй можно даже типы перегонять в друг друга через стринги. По ёбнутому конечно, но работаети.
"сделать что-то на питоне" это означает написать кучу скриптов, вызывающих для работы сишный и крестовой код
Язык Си. Можно использовать С++ как Си с классами, просто для удобства. Но про STL забудь, у ембед систем памяти с гулькин хуй.
Если ты ещё не понял, самого кодирования в робототехнике не так много, как кажется, гораздо больше тебе понадобиться смежных знаний.
> Но про STL забудь,
Есть же etlcpp и прочие
> у ембед систем памяти с гулькин хуй.
64-128кб уже достаточно доступные, чтоб об этом не переживать так сильно
Если памяти чуть побольше - сразу вешаем на камень RTOS, чтобы не писать велосипеды.
>то на питоне" это означает написать кучу скриптов, вызывающих для работы сишный и крестовой код
>
Какой язык такие и программы
Земля пухом тогда.
Ctrl d и ctrl k не срабатывают.
извини, у меня было ощущение, что ты сам не знаешь, на чем пишешь, поскольку ты даже не написал на чем. а че винапи не гуглится?
Гуглил, там говорят кидать глобальный хук, я не хочу, потому что тогда приложение всегда будет требовать права администратора.
Глянь как autohotkey и ditto сделаны.
Eigen?
>внутри представленные как нересайзещейся вектор.
Почему не хотя бы std::array тогда?
Или вообще бустовский мультиаррай, там наверняка есть прокси классы для ускорения вычислений над многомерными массивами.
>создание такой и текстуры занимает много времени
ну дык поделай оптимизации, типа банального reserve, операции перемещения типа emplace_back вместо push_back и прочее
>ее обработка тоже
какие операции то нужны? че делаешь то? прямой перебор, доступ по интексу у вектора оче быстрые, быстрее не сделать
в любом случае без каких то подробностей и кода сложно что-то посоветовать
но совершенно точно, нужно сначала попытаться соптимизировать собственный код, работающий с stl, чем сразу бросаться искать альтернативные решения на стороне
main.cpp:(.text._ZN7audiere10OpenDeviceEPKcS1_[_ZN7audiere10OpenDeviceEPKcS1_]+0xe): u ndefined reference to `AdrOpenDevice'
Что значит данная ошибка?
Если сделаешь override для не виртуального метода, то компилятор будет ругаться.
override и final – для безопасности (типа как const, просто чтобы компилятор ошибку выдал если пытаешься сделать что-то не то). Ну а без virtual виртуальной функции не получится.
g++ main.cpp -L /usr/local/lib/libaudiere.a
Вроде бы подключение библиотеки проходит так, но у меня все ровно вылетает ошибка
да, да
stl традиционно очень медленный на дебаге, скорость в некоторых местах может проседать на порядок
но возможно, в новых компиляторах это и не так
но раньше было точно
Флаг -L задаёт путь к библиотекам, чтобы потом линковать их с помощью -l[название библиотеки без префикса lib и расширения .a]. Либо убери -L и оставь полный путь, либо напиши -L /usr/local/lib -laudiere
/usr/local/lib у него все равно будет в путях
Алсо стоит заметить, что порядок важен и
g++ main.cpp -laudiere #работать будет
g++ -laudiere main.cpp #работать не будет
Не нужно. STL никогда не подразумевала хорошую имплементацию 3д массивов, а vector<vector<vector<>>> это вообще худшее что может быть. Даже васяновелосипед на основе vector<> и маппинга из 3д в 1д будет сильно лучше работать
Эх, помню я когда препод по программированию в универе посчитал передачу в функцию ссылку на указатель как каким то неимоверным предом, хехе, как же забавно сейчас вспоминать.
>передачу в функцию ссылку на указатель
очень подлая вещь, на самом то деле, поведение которой может удивить среднего разработчика
тк в этом случае не производится низводящих преобразований..
по ссылочке, по универсальной ссылочке, которая обеспечит move-семантику..
никаких проблем..
разве что вообще дурной тон оперировать контейнерами, в функцию на обработку нужно передавать пары итераторов, указывающих на диапазон..
а если следовать идеологии stl то и такие функции не следует писать, а надо действовать через стандартные алгоритмы, те писать по сути в псевдо-функциональном стиле
>Стоит юзать вектор или можно обойтись в принципе пацанским выделением динамического массива в проде? Какие подводные у обоих вариантов.
главный подводный камень - то что, задавая такие вопрсы, ты, по видимому, уже работаешь..
а это пиздец..
судя по твоим ответам, ты не работаешь, и не скоро еще станешь
сперва, ведь, надо школу закончить
а там и армия, где ты будешь рассказывать, какой ты у мамы самый умный
Дружочек, если у тебя в две тысячи девятнадцатом году возникает мысль "а не выделить мне немного памяти через new", то ты мудак и хуй его знает как прошёл испыталку. Или у вас в конторе все такие отбитые и код с new проходит CR?
Подскажите, важно ли хорошо знать С, прежде чем преступать к С++, или будет достаточно пробежаться по подобному курсу https://www.youtube.com/playlist?list=PLRDzFCPr95fLjzcv6nNdjMu_9RcZgIM9U ?
Уже более-менее знаком с java и python, хочу перекатиться на плюсы
Синтаксис тебе и так придется выучить (си практически подмножество цепепе). Лучше учи стандартную библиотеку плюсов, если понадобится, выучишь и стандартную библиотеку си.
Задача такая: мне приходит массив данных, амплитуды, в двумерной сетке, и я по приходу сразу проверяю, что из этих данных принадлежит уже сформированным кластерам. Картинка похожа на долматинца, черные пятна (с резкой границей) на белом фоне. Так вот мы сканируем долматинца вдоль, и пробуем сразу объединить черные пятна - кластеры.
Кластер - вектор. Я создаю новый вектор с каким-то приблизительным размером и резервирую ещё половину.
По приходу нового измерения проходит поиск по всем формируемым пятнам. Пятно завершилось - уходит из формировалки.
Формируемые пятна хранятся в листе. Параллельности нету нихуя, все ебашится в одном потоке.
Задача вроде как телретически решается в матричном виде, и Eigen очень хорошо заходит с его-то бекэндом, и векторизуется по-хорошему все это говно, но надо как-то в матричном виде все записать.
>>501310
Мультиаррай почему-то не понравился, не помню почему. Как-то не совсем для задачи подходил.
std::array говорил мне, что многовато на стеке выделяется блядь, не хорошо так. Поэтому взял стд::вектор, там в куче создается все.
>>501606
> Что-то мне подсказывает, ему для начала нужно с дебага на релиз переключиться
))))
Всем спасибо.
>Картинка похожа на долматинца, черные пятна (с резкой границей) на белом фоне
Так тебе вот это нужно
https://docs.opencv.org/trunk/dd/d49/tutorial_py_contour_features.html
Да, судя по тому какой фурор тут вызывает упоминание сырых указателей, соглашусь.
Подошёл к моменту когда нужно прикручивать бд.
Хотел обойтись без MySQL,заюзать что нибудь более легковесное и модное-молодежное.
Посмотрел в сторону redis, но насколько понял, это уж слишком что то простое, хранение и извлечение текстовых сообщений там будет неудобным.
Что можете порекомендовать? Mysqlite?
ебаш сразу эластик, чтобы поиск было удобнее делать
имхо, нужно как минимум прорешать K&R прежде чем браться за изучение крестов
но я сторонник последовательного изучения
на проекте нельзя использовать сторонние опенсорс решения? если можно, то не пили велосипед, используй их
opencv, tensorflow,, что то аналогичное, в общем
Текстовые сообщения , ассоциированные с пользователями их приславшими,с беседами в которых эти сообщения были отпралвены и метками времени -
чтобы к примеру для определенной беседы, в которой состоят Петя Ваня и Маша можно было удобно запросить сообщения за последний день, и дальше, если потребуется, или устроить поиск по истории сообщений к примеру.
Или неужто мне предложите это в оперативной памяти хранить?
храни в файликах на диске
> (уник) пойнтер на данные
просто член с данными, пойнтер тут нахуй не нужен. в общем, выбор между хранением в ноде или класса с моей хуйней, или просто всю хуйню в сразу нод добавить.
фикс
Нахуя учить плюсы в 2к19, если любая вакансия на плюсах == разгребание легаси-говна? В имбэддэде пишут на Си, в вебе совсем другой стэк технологий, там макакаскрипт с зоопарком фреймворков рулят отраслью, микросервисы и распределенные системы пишут на Го нынче.
Если ты не хочешь стать гейм-девелопером с релокейшеном в СШП (ибо в рашке ловить в этой отрасли нечего), то нахуй учить плюсы? Занимает это все дело годы, ибо это плюсы, а выхлоп никакой, 9 работ из 10 для плюсовика - разгребать легаси-дерьмо.
Поправьте, если неправ, так как это мнение, а не утверждение.
Первый отвечает требованиям StandartLayoutType, второй - нет.
С экземплярами этих классов нужно сделать действие А.
Но для StandartLayoutType А означает одно, а для не StandartLayoutType - другое.
Как написать универсальную функцию, либо шаблонную конструкцию выполняющую А для любого из этих типов?
найди любого человека со студентческим билетом и на него оформи бесплатную лицуху сидел так 3 года, потом на работе купили
>>502271
> если любая вакансия на плюсах == разгребание легаси-говна?
Нет.
> Если ты не хочешь стать гейм-девелопером с релокейшеном в СШП (ибо в рашке ловить в этой отрасли нечего), то нахуй учить плюсы?
В любом случае нахуй не надо учить плюсы, если ты планируешь быть игромакакой, надо учить либо хуюнити, либо блюпринты.
> 9 работ из 10 для плюсовика - разгребать легаси-дерьмо.
Да, но тебе никто не мешает устроиться на 10ую работу.
>Нет.
Аргументировать можешь? Где сейчас плюсы незаменимы и широко используются? Про имбэддэд, вэб и всякие микросервисы я говорил - там С++ заменен давным-давно.
> Нет
> Да, но тебе никто не мешает устроиться на 10ую работу.
Противоречишь сам себе. Сначала говоришь, что, якобы, не 9 работ из 10 на крестах - разгребание легаси-говна, а потом говоришь, мол, да, но никто не мешает найти 10ую работу. Шта? Определись
Большая часть работ говно. Но оно и в вебе, и во всем на свете. Тебе никто не мешает прокачаться и выбирать реально интересные предложения, как сделал я.
>>502306
> Где сейчас плюсы незаменимы и широко используются?
Все системное программирование, алле. Весь high-performance. Бэкенд всех сервисов яндекса на крестах, например.
https://ideone.com/Sh0xc8
> найди любого человека со студентческим билетом и на него оформи бесплатную лицуху
Где-то это я уже видел... По-моему ты мне и отвечал несколько тредов назад. У меня нет знакомых студентов.
> Все системное программирование, алле.
Все системное программирование на Си, а не на плюсах, алло
> Весь high-performance
Разве что в разработке игровых движков и чего-нибудь связанного с графикой. Распределенные системы и высоконагруженные сервера пилятся на том же Го, так как язык проще, безопаснее, скорость разработки гораздо выше и там есть горутины, каждая из которых весит 2 кб, что позволяет уходить в самый жесткий мультитрединг.
Если честно, мне страшно предположить что случится с Си и плюсами, когда тот же Раст выстрелит и пустит корни в хайтек.
> Все системное программирование на Си
Ты хотел сказать, все легаси говно из 90 на Си. Никто на Си уже не пишет. Да, даже жопные контроллеры программируют на плюсах.
мимо
> когда тот же Раст выстрелит
То есть никогда, лол.
Как вообще связаны корутины с мультитредингом? Это разные вещи. В бусте они тоже есть, если что.
обычно студентиков в вузах учат на си писать (это когда идут курсы по алгоритмикам и все такое)
студентоз потом доучивает кресты
и все, человечек в ловушке, подсел на технологический стек
роботает потом за копеечки и все такое
Хочу на крестах пилить сетевые приложения (с возможным уклоном в последующую разработку сниффера и/или пакет инжектора, для портфолио, так сказать).
Есть два стула: QT Network и Boost.Asio. На какой сесть? В обоих чет не видел интерфейс для сырых сокетов. Что будет лучшим выбором?
А хули ты хотел, она ж не виртуальная.
>Нахуя учить плюсы в 2к19, если любая вакансия на плюсах == разгребание легаси
Чтобы разгребать легаси.
вот я и говорю им, кому нахуй всрались сейчас плюсы? В их манямирке он нужен для перформанса, на деле в компаниях в 2к19 работает принцип "хуяк-хуяк и в продакшн". Софт говно порой выходит, базару нет, но это реалии айти на данный момент. Никто не будет нанимать плюсовика на бэкэнд, если его можно написать на ноде/го, где разработка будет х10 быстрее, без мемори ликов и тонны жопочасов отладки неведомой хуиты. Насчет роли плюсов в имбэддэде тоже очень сомневаюсь, там пишут на Си, напрямую дергая API ОС и не парятся, так как в имбэддэд разработке ООП вообще не нужно, ибо это байтоебство чистой воды, там тупо не нужны такие пласты абстракций. Плюсы в имбэддэд - это все равно, что из пушки по воробьям хуярить.
не ломай себе жизнь, пиши подобный софт на Го. Потратишь во много раз меньше времени, сэкономишь нервы, не будешь получать сегфолты и утечки памяти направо и налево. Никто не использует плюсы для сетей в 2к19.
> в последующую разработку сниффера и/или пакет инжектора, для портфолио
Ебу дал? Ты хоть знаешь как это работает и реализуется? Драйвера писать умеешь?
Только не говори ему, на чем написан рантайм ноды.
Я на Си писал сниффер через сырые сокеты, в чем трабла. Да, это не второй уайршарк, но все же.
Умею, но только хэллоуворлдные
>уайршарк
Блядь, нахуя вы это делаете? Тебе раскладку переключить выйдет быстрее чем нам прочесть эту хуйню.
libtins
Зашел сейчас в репозиторий ядра линукса на гитхабе: C 96.5% , C++ 1.3%. Плюс слышал, что майкрософт когда то пытались перенести ядро своей ос на с++ и ооп подход и обосрались, потеряв много денег, ядро до сих пор на си. Торвальдс вот ещё всегда топил за си. Оно и логично, так как си создавался как портируемый ассемблер, си гораздо более легковесный язык, чем си++, поэтому абсолютное большинство низкоуровневых системных вещей написано на си.
мимо
>Купи vs2019
Так он и стоит, в intellisense всё в перемешку, вот эту настройку уже покрутил, не помогает.
огромная часть говна конкретно под линуксы на сишечке пишется до сих пор. почти все виндовсменеджеры-конпозиторы как один из примеров. не так давно на реимплементацию осома под вейланд, которую хотели на расте сделать, перекатили на си, поскольку не смогли в wlroots под раст (кусок с композитором по крайней мере, остальную часть будут в расте пытаться). собственно, разрабы которые пытаются в suckless обычно пытаются делать говно в си (ебонутые).
Много подсистем майкрософта на крестах, собстно, пишем драйвер на С++17, все отлично, лучше, чем сишная блевота.
Вполне возможно, что в 2000 си был выбором лучше, чем С++98 с зоопарком говна. Сейчас си не нужен вообще нигде.
tag dispatching ещё поищи
> Именно поэтому винда мусор, лол)
О, тут красноглазые дауны приехали. Ладно, с сектантами спорить - себя не уважать.
Ля, виндузятник порвался
Кто юзает винду среди программистов? Дотнетчики и разрабы игр, ну и те, кто малвари ковыряют, лол
90% разрабов сидят на юникс-лайк ОСях, винда - глючный, костылированный, неудобный мусор для прогера. Она годится только для домохозяек, ради которых и, собственно, разрабатывалась. Ну и для игродаунов.
Цистерну бсодов тебе на ебало, короче))0
напиши полноценный драйвер (сетевой или блочный, например) на крестах на Линукс, я поржу. И попробуй закоммитить его в мэйнтри, тебя обоссут быстрее, чем ты думаешь
> Именно поэтому винда мусор, лол)
> А на Линуксе на крестах невозможно писать драйвера
На линуксе невозможно Х, а мусор почему-то винда.
Это тред си? Почему тут сиктанты?
Потому что богоподобный Линукс написан на Си, как ты будешь писать кернел дрова для ядра, написанного на Си, НЕ на Си? Ты совсем что ли еба?)0
Да и вообще, писать кернел на плюсах с его темплейтными оверхедами в участке памяти, где нет пэйджинга (кернел спейс) - такая себе затея. Кресты СТРОГО не подходят для написания ядра, особенно, если надо создать реально шуструю и лаконичную ОС, а не ебучего Франкенштейна
да, да, дурачок, мы все поняли уже. Можешь дальше обмазываться своим дерьмом и кукарекать на параше.
это проблема не крестов, а сектантов
полудурок не знает про extern "C". Ладно, посмеялись над клоуном и хватит.
> Потому что богоподобный Линукс написан на Си, как ты будешь писать кернел дрова для ядра, написанного на Си, НЕ на Си? Ты совсем что ли еба?)0
Нет, я не "еба", мне интересно, почему нельзя.
https://stackoverflow.com/questions/10469188/is-it-possible-to-develop-a-loadable-kernel-module-lkm-on-linux-with-c
Почему тут нужен какой-то интерфейс? Почему недостаточно >>502439?
Ты же не хочешь сказать, что это должно быть НУ ПРОСТО ОЧЕВИДНО каждому, кто может баблсорт написать? Впрочем, зная, какие люди посещают этот сайт, ты вполне можешь оказаться из таких и даже найти единомышленников (которые могут быть как реально умными людьми, способными объяснить почему, так и просто уебанами, которые сами не знают, а просто услышали и повторяют).
Делаем for(;iterator!=list.end(); ++iterator ) по итератору в листе, и когда находим определенный элемент пишем такую йобу: list.insert(list.erase(iterator), "data");
Так вот, почему после этого цикл по итератору спокойно продолжает идти дальше, если элемент, на который итератор указывает, уже стёрт?
Оформись на stepik.org.
Там за прохождение курсов дают 3 месяца idea и resharper, кончится - запишись на ещё курс, пройди немного и получишь ещё лицензию.
Я вообще думаю, что ты словил UB, т.к. вообще итератор инвалидироваться должен после такой операции.
А так - ты понимаешь, как удаляется элемент списка? Ссылке на следующий элемент предыдущего присваивается следующий элемент текущего, а для текущего вызывается деструктор данных.
То есть твой итератор указывает на удаленный объект, который внутри себя хранит ссылку на следующий. Делаешь operator++ и итератор перескакивает на следущий, только он теперь стал текущим.
Хотя, по идее, твой итератор должен был указывать на текущий элемент, а текущий теперь - это следующий за удаленным, и после operator++ ты должен был его проскочить.
Попробуй сделать cout для каждого и посмотреть, что выводится.
Хрен его знает, пропозал n1692 датирован 2004 годом. И я слышал много разговоров про wide_int. Видать недостандартизировали
если у тебя
iterator = list.insert(list.erase(iterator), "data");
То все валидно.
Если именно то, что ты написал - то это UB
>list.insert(list.erase(iterator), "data");
непойму зачем ты так делаешь
разве не проще просто изменить значение элемента на который указывает итератор?
>Выполняет ... правильно
Так итератор же не в курсе, что он ссылается на удаленный объект. А так как это UB, то он инкрементируется правильно в твоей ситуации.
Попробуй в дебаге скомпилить, там есть валидация итераторов, стандарт обещает вызвать std::terminate в такой ситуации.
Либо попробуй другой компилятор, может быть другой результат
Покормил очевидного тролля
Тсс, а то вдруг он сейчас загуглит, как работает линковщик и догадается, что можно еще и ассемблерные спагетти в проект подцепить.
хм, и как это меняет ситуацию?
указатель на константные данные это тебе не константный указатель вообще то
Да успокойся уже. Никто не трогает твой швитой жму/пинус.
Продолжу вопрос линуксошизика: а рили, как писать дрова на линупс на крестах? И надо ли? Если захочешь его законтрибьютить, то рили же нахуй пошлют
мимо растоеб
Написатт реально, как и на расте. А вот принятие надо с красноглазиками обсуждать. Винда в этом плане мудрее, достаточно драйвер только подписать
А как именно? Ибо в гугле расплывчатая инфа по сабжу, или это я спать хочу просто и засим ебусь в глаза
https://github.com/veltzer/kcpp мне кажется ок инфа
Расскажу по своему опыту про шинду - надо тупо несколько функций типа DriverEntry помаркать как extern C, все. Дальше, делай что хочешь без стандартной библиотеки.
хоть шаблоны, хоть лямбды, хоть if constexpr, хоть structured биндинги
не думаю. Только за RAII уже можно си выкинуть на помойку и не вспоминать больше никогда и нигде.
анон, если ты уверен в своей точке зрения, то говори её полностью и прямо, а не ограничивайся пассивно-агрессивными подпиздываниями и всякими намеками.
С ней не лучше, хотелось бы чтобы именно члены класса были первыми, а не всякий срач с каких-то .h файлов.
Как вы с этим живёте? IntelliSense для C# в разы лучше работает.
Всё, разобрался.
vector::erase
Removes from the vector container and calls its destructor but If the contained object is a pointer it doesnt take ownership of destroying it.
(Хоть тут и для вектора, я думаю оно работает аналогично и для других контейнеров)
https://stackoverflow.com/a/6353169/7711537
О, тоже мессенджер пилишь? Я постгрес взял, полёт нормальный.
C# вообще говно для макак, как можно пользоваться таким неудобным говном, которое с собой ещё и гроб в виде object таскает.
Вот только оно на приктике удобней. Ну ка сделай мне split строчки без ебли на плюсах.
Сходил на собес в Московский хуавей по фану, на сениор крестомакаку. Слышал про кучу обещаний золотых гор, что хуавей платит. На деле:
Все числа без вычета 13%, т.е. на руки меньше.
Зарплата - 260к ежемесячно. Если ты работаешь лучше, чем 5% конченых долбоебов - еще 2 зарплаты ежегодно. Если лучше, чем 50% долбоебов - еще 1 сверху, итого 3. Если лучше, чем 95% долбоебов, еще одна - итого 4.
Sign-on бонус - 1 зарплата.
Короче, ожидал сильно большего, такие делы.
Что там делать то, string поддерживает индексацию, дальше элементарно
Можно ещё бахнуть стрингстрим, например, чуть быстрее накодить выйдет
не SDL, а OpenGL, самофикс
wstring заюзаю, в чём проблема?
Не помню, чтобы были мидловые крестовакансии, но, в любом случае - тебе нужно только идеальное знание С++, включая С++17, т.к. мы пользуемся самыми последними фишечками, и стабильно переезжаем на новые компиляторы\стандарты.
>Что там делать то, string поддерживает индексацию, дальше элементарно
А на C# я просто пишу String.Split() и получаю нужное. Элементарная разбивка строки на подстроки в плюсах это боль.
В общем на мой вопрос никто так и не ответил, а жаль.
>Элементарная разбивка строки на подстроки в плюсах это боль.
Нет никакой боли, обычный split как раз обычно не совсем подходит и тогда в шарпах приходится писать какие-то костыли через indexof, когда в плюсах можно удобно всё сделать и потратить намного меньше ресурсов.
>обычный split как раз обычно не совсем подходит и тогда в шарпах приходится писать какие-то костыли через indexof
В этом то и суть, когда не подходит то пишешь что тебе там удобно. В 99% случаев достаточно функционала из коробки.
>>502972
Миллоны программистов в миллионах проектов каждый раз пишут функцию из 10 строчек. Вместо ёбанных рейнджей охуеть блять begin() end() просто спрятали лучше бы сплит сделали.
Вот как раз Split из коробки говно, сколько раз не юзал, всегда было проще самому написать, чем ебаться с ним.
Я просто недавно начал в него вкатываться и боюсь как бы не остаться никому не нужным с ним. Что скажешь по поводу GDI+?
Факт в том что он есть, и не надо писать что-то своё каждый раз. Стандартная либа плюсов очень ограничена по сравнению с шарпом.
>Стандартная либа плюсов очень ограничена по сравнению с шарпом.
Что ты подразумеваешь под стандартной либой? Шарпы тебе сразу всё говно тянут, в плюсах всё разбито по нужным блокам. Буста и Стл хватит с головой чтобы покрыть все функции из библиотеки шарпов.
>Факт в том что он есть, и не надо писать что-то своё каждый раз.
Пиздуй тогда в джаваскрипт, там как раз уже всё написал за тебя, только будешь функции вызывать.
>GDI+?
Не нужно, когда есть OpenGL, Direct2D\Direct3D. Но в любом случае, я больше по вещам типа файловой системы, и прочей системной херне, а не графончику. Специфика команды.
Объясните мне, почему у лямбда-функций не может быть дефолтных аргументов?
>Шарпы тебе сразу всё говно тянут, в плюсах всё разбито по нужным блокам.
Точно так же всё разбито на отдельные части.
>Буста и Стл хватит с головой чтобы покрыть все функции из библиотеки шарпов.
Буст таки не входит в стандартный комплект.
>Пиздуй тогда в джаваскрипт, там как раз уже всё написал за тебя, только будешь функции вызывать.
Хуйли ты злой такой? Или о плюсах как о мёртвых надо - или хорошо или ничего?
На всякий случай
Раз они косплеят функции, то пусть будут максимально на них похожи, чтобы меньше деталей запоминать - например за этим
Потому что каждую переменную может потребоваться захватывать по разному.
[=] или [&] тебе в помощь, блядь
таки лучше было бы чтобы ты вместо сырых указателей в своем списке использовал unique_ptr
а то что ты делаешь, делал бы через обычное присваивание
так было бы меньше вероятности что ты отстрелишь себе ногу
Они косплеят функторы.
>Ну ка сделай мне split строчки без ебли на плюсах.
Boost tokenizer
или
Boost String Algorithms - split
ты зажрался, дружок
даже 200к, даже в дс - просто заоблачные деньги, просто деньги которые решают все проблемы..
Тащить огромную либу ради функции, которая во всех нормальных языках есть из коробки. Плюсы такие плюсы
потому что основное применение лямбда функции - сконструировать ее по месту и сразу передать на выполнение
>Байтойобство здесь — https://gcc.godbolt.org/ все очень удобно оформлено даже для нюфагов, куча версий компиляторов, дают тыкать настройки ручками — ляпота короче.
А есть такой же сайт для байткода джавы?
потому что лямбды в крестах пытаются косплеить замыкания в функциональных языках
но, конечно же, следуюет помнить что лямбды у нас таки не полноценные замыкания и мы не можем делать на них те штуки что делают в языках лисп-семейства
ты троллишь что ли?
ну дык напиши тогда свою функцию токенизации на stringstream, она будет размером строк в 10
Писать свою функцию, которая во всех нормальных языках есть из коробки. Плюсы такие плюсы
был бы твоим манагером, тебя бы выгнал на мороз, набрал бы на твое место 3х бородатых синьоров-помидоров за 120к и еще бы на пару стажеров денег хватило
> Дальше, делай что хочешь без стандартной библиотеки.
Можно и с ней, только придется переопределять всякие new/delete и прочее.
Ай пиздабол, нет таких зп в ДС, даже в срунвидии. Да и выше ты писал, что хуйней какой-то занимаешься, а не конкретно дрова пилишь. Врёти.
Дрова пилятся в Санта Кларе, мы тут тоже дохуя полезного в Московском офисе делаем.
> больше года была открыта вакансия на тот же грейд\зп, что и у меня
> Хуй кто прошел, причем сильно не валили
А вот тут пиздишь точно
Я персонально собесил людей, и потом фейспалмил, когда приходят додики, хотят 300 тысяч зарплаты, и даже не знают, что такое вариадик шаблон. Или там арифметику указателей сложнее чем инкремент указателя не знают. Про что-то адванцед, типа мув семантик вообще 2 человека рассказали за год (собстно, их и наняли, сидят рядом со мной, но вакансий было штуки 4, насколько я помню).
>типа мув семантик вообще 2 человека рассказали за год
Вот тут поддвачну, из кучи собеседуемых мной людей об этом человека три рассказали. И то пиздец как обзорно есть подозрения, что они просто смогли перевести слово move на русский язык
Друг, ты идешь на вакансию со стартовой зарплатой 280-300к на руки. Ты на эти деньги мне должен обьяснить как это все работает, написать простенький move-only класс, и обьяснить, в идеале, еще и про forwarding reference.
Звучит сложно, но на деле - это пара десятков страниц из книги Скотта Майерса про модерновый сиплюсплюс. И да, мы это активно используем в коде, а не доебываемся потому-что можем.
r>>temp;
r - istrinstream, проблема в том, что while исполняется на 1 раз больше чем слов в строке, почему?
>Ты на эти деньги мне должен обьяснить как это все работает
А хули тут рассказывать то? Просто же компилятор может взять и скопипастить данные из другого класса не делая при этом deep copy и оставляя перемещаемый объект в невалидном состоянии. Все временные объекты ||они справа обычно от знака = || rvalue.
> move-only класс
struct A {
A(&&) = delete;
A operator= (A&&) = delete;
A (const A&) { /do something/ }
A operator=(const A&) { /do something/ }
}
Оно что ли?
Блядь, это же не дискорд, тут спойлеры иначе пишутся
Это только один вопрос из многих. Все что мы требуем - знание С++, не более. Но его вообще почти никто не знает, только какие-то куски, понимания вообще нет у среднего претендента на сениор девелопера. Ну и да, мы требуем модерн, как я выше писал. Если ты в 2019 году остановился на С++11, ну, сорьки, что еще сказать. Мы переедем на С++20 как только студия начнет его поддерживать.
>А хули тут рассказывать то?
Вот ты не поверишь, даже этого добиться от среднего претедента уже проблема.
> move-only класс
Ну, подразумвается, что есть какой-то ресурс еще, который надо переместить. Например хэндл, или указатель, или что-то еще тривиально-не-копируемое.
Ну, останавливать тебя от подачи резюме точно я не буду.
> Ну, подразумвается, что есть какой-то ресурс еще, который надо переместить. Например хэндл, или указатель, или что-то еще тривиально-не-копируемое.
Ну это прям жуть как сложно. мегапримитивный unique_ptr
за 430к я готов устроить опенспейс хоть у меня в анусе
да, но он более-менее комфортный нет гигантских пространств, тупо 1 очень вытянутая комната на каждом этаже.
Млять, серьёзно что ли люди, которые идут на позицию сеньера с зп в 400К не могут написать такое? Мне сейчас с моей зп в 30к стало просто неимоверно обидно
Все настолько плохо, на полном серьезе. Но, я повторюсь, это далеко не единственный вопрос с собеса.
>Все настолько плохо, на полном серьезе. Но, я повторюсь, это далеко не единственный вопрос с собеса.
Можешь ради интереса кинуть 1-2 самых сложных лол
Просто это не Москва и не город-миллионник. Когда я был джуном, то зп вообще была 17к не знаю, почему я не уехал никуда
написать вариадик тимплит, который принимает кучу разных чисел (все беззнаковые, но разные по размеру), возвращает их сумму, и падает со статик ассертом, если хоть что-то из аргументов не число. Но это бонусный вопрос. Смог написать 1 из двоих нанятых.
еще многопоточку спрашиваем (обожаем ее), ну и вообще, дефолтные вопросы за эксепшены\полиморфизмынаследования. Так то, ничего сложного, если ты не отстал на 10 лет от тренда.
я по памяти напишу за минуту на доске. Алсо, давали гуглить в качестве эксперимента - все равно не писали.
> написать вариадик тимплит, который принимает кучу разных чисел
Ты сейчас серьёзно? Это типа сложно да ещё и с гуглом?
Писал по памяти (давно не пользовался, на работе чертовы деды на 11 сидят).
В 17 можно ещё проще, но я не вспомню точно синтаксис
Что-то типа такого
template<typename T, typename... Args>
auto sum(T a, Args ...args)
{
return args + ... + a;
}
Но вот тут я затрудняюсь сказать, как static_assert'ом чекнуть все значения
ПМ картавит, старший разраб заикается, я (тимлид) часто чрмлагтсаарлмпоордзж говорю или что-то подобное, когда параллельные мысли в голове.
Всем пох.
Шипилявого тестера травим
Тестера грех не травить
первая работа должна быть любой. Ты на опыт работаешь. Дальше уже выбирать можешь.
Ну не должна, но если других вариантов нет, то пусть работает. Уйти можно всегда. А так хоть будет что заявить на следующей. Так что да, стоит, если нет других вариантов
Для варианта со сверткой можно if constexpr сделать, я думаю. Компайл-тайм как раз, под условия подходит. Свёртка же, кажется, не требует одного только return в теле функции.
Кстати, нвидианон, а нужна функция, которая съедает слагаемые аргументами функции, не аргументами шаблона?
Можно же написать sum<1, 2, 3, 4, 5, 6>::value, по аналогии с компайл-тайм факториалом, насколько я понял шаблонную магию.
Пометка к первому абзацу: смотрел лекции Хандельянца(который главный разраб pvs studio), он сказал, что способ из C++17 потом компилятором разворачивается в тот код, который у тебя на скрине. То есть, достаточно проверить параметр "а" на беззнаковость, по идее.
Конечно можно. Только следи за временем жизни, чтобы объект по ссылке не удалился раньше класса, в котором он используется.
це ide - Visual Studio Code. Ничего, кроме как синтаксис подсвечивать , она не умеет. Об анонах забочусь, чтоб они не мучились, читая чёрно-белый код
То что можно - это понятно. Вопрос больше в том, насколько это нормальный подход. По моему это в разы хуже, чем юзать указатели. Шанс получить dangling reference точно такой же, как и удалить объект по указателю где-то и получить указатель на невалидную память
>Для варианта со сверткой можно if constexpr сделать, я думаю. Компайл-тайм как раз, под условия подходит. Свёртка же, кажется, не требует одного только return в теле функции.
Как то я вообще не могу понять, как ты сюда хочешь if впихнуть
CRTP и тот же самый variadic template ты обязан понимать, type_traits туда же, forwarding туда же, на всякий случай ещё boost::mpl/mp11/fusion/hana должен понимать
мимо другой аное
Это же наоборот уебанство, лучше пусть коллеги подальше сидят, чтобы я их пердёж не слышал а они мой
> По моему это в разы хуже, чем юзать указатели.
Это в разы лучше.
>Шанс получить dangling reference точно такой же, как и удалить объект по указателю где-то и получить указатель на невалидную память
Шанс получить висящую ссылку нулевой. Нужно просто™ следить за временем жизни своей хуйни.
Если ты не можешь проследить за временем жизни - то у тебя нихуя не получится даже с указателями.
> Нужно просто™ следить за временем жизни своей хуйни.
Точно такая же ситуация и с указателем. Надо просто™ следить за временем жизни своей хуйни а лучше забыть об этом говне и взять std::shared_ptr
ну пожалуйста
Пояснишь?
В данном случае разница между ссылкой и указателем в том, что ссылка всегда на что-то ссылается (не факт, что на что-то валидное, ибо никто не мешает хуйнуть в неё объект, которой впоследствии разрушится при выходе из scope) и её не нужно уничтожать, ибо за объект отвечает кто-то другой.
С указателем точна та же херня. Его можно забыть инициализировать или можно разрушить объект, на который он указывает. И кто-то должен удалить его. Возможно кто-то другой
Каких-то явных преимуществ ссылок вообще не видно. А недостаток - крайняя неочевидность того, что конструктор класса или метод принимает ССЫЛКУ, которую потом ещё и хранит.
shared_ptr решает все эти проблемы. Его хуй сделаешь невалидным и не нужно следить за его уничтожением. Чекать ifом его элементарно. Да, можно с пеной у рта орать, что его копировать медленно, но эти несколько наносекунд от нескольких копирований никакой роли не сыграют
А атомик счётчик внутри shared_ptr - это норма? 40 тактов на инкремент против одного?
А ещё в каком-то из тредов видел, что написанная с shared_ptr программа - нездоровая, что ее можно переделать на unique_ptr и победить проблемы.
Но это неточно, только слухи.
А где вообще может возникнуть необходимость ссылаться на один объект сразу нескольким господам? Многопоточка?
Так и есть. Даже на CppCon'e об этом выступление есть и не одно.
ПЕРЕКАТ >>1503420 (OP)
ПЕРЕКАТ >>1503420 (OP)
ПЕРЕКАТ >>1503420 (OP)
ПЕРЕКАТ >>1503420 (OP)
ну смотри: есть несколько пользователей ресурса
как только пользователей этого ресурса не станет или он им больше не понадобится, ресурс уничтожается
вот и все
>Все настолько плохо на рынке труда нынче.
обычные голодные игры
капитализм хуле
один выжил, получает свои 300к и ему заебись
остальные как крысы забились в свои норы, откуда они попытались вылезть
или уже здохли к 30ти-40ка годам
причем молча
Ты непробиваемый. Если в коде я вижу ссылку, значит я могу быть уверен, что объект не разрушится, пока живёт этот класс. Если я вижу указатель, значит стоит ожидать, что какой-нибудь уёбок может сделать его невалидным.
Самый простой пример: нужно вывести в диалоге список лучших аниме тайтлов, т.е. сформировать список -> создать диалог -> установить ему список -> показать. Предлагаешь делать shared_ptr<vector<T>>? Или может передавать туда T★?
99.9% всех потребностей любого крестовика - это создать объект на стеке/через make_unique и передавать ссылку на него.
Почитай на досуге
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#rsmart-smart-pointers
Вот это '->' и это '().' одно и тоже, следовательно ты делаешь ((t_).f_)(args ...)
Ты обращаешься к члену c именем f_ типа сласса t_
почему-то знак звездочки исчез перед f_
Меня больше удивляет зачем они на сеньоров приходят собеседоваться. Тут в чатах сеньоры устройство процессора и ОС знают на приличном уровне, математическую базу имеют и 10+ лет опыта, а у этого анона приходят полумидлы видимо с надеждой что прокатит, я хуй знает как это еще можно обьяснить.
А ещё потому что хуй его знает, когда ты джун, миддл или сеньор.
Я изучаю плюсы для себя, смотрю лекции/читаю книги/практикуюсь/пишу мелкие утилиты на работе, вроде знаю уже много(лол), но на джуна не потяну - нет опыта.
Более того, я на основной работе имею знания сеньора(судя по тому, как у нас собеседуют на эту вакансию, прошел бы собес), но опыта работы полтора года и максимум тяну на миддла, потому что одних знаний мало. Странная вообще градация, как по мне - но другой нет.
Ну так мало знать язык, надо еще и уметь навыки работы в продакшене. Можешь быть хоть братом Дурова, если ты будешь тратить полтора месяца чтобы написать охуительно быстрый йоба-боба рест-сервер просрав все дедлайны, то бизнесу ты нахуй не нужен, наймут пхп макаку которая твою задачу сделает за неделю и всё.
Pascal
Вы видите копию треда, сохраненную 16 ноября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.