🦥Alex Fails
Винда ж😄
Alexander "SonnySlave"
пкетные менеджеры, не?
🦥Alex Fails
Мне лень
Alexander "SonnySlave"
ааа, ССЗБ, ясно
🦥Alex Fails
Все так, д😊
Stanislav
Винда ж😄
🤔vcpkg/conan тебя спасут
🦥Alex Fails
Сложно
Egor
а как надо?
🦥Alex Fails
а как надо?
Взять cppan и с его помощью собрать
Egor
пробовал?
🦥Alex Fails
пробовал?
ночью сегодня попробую
Egor
я сейчас как раз залью 1.67
🦥Alex Fails
👍
Nikita
Мне лень
А что, скачал, прогрелся минут 30 и всё.
Aleksey
Qt creator пишет ошибку undefined reference to имя класса конструктор класса, в чем может быть проблема?
Aleksey
Проект состоит из 3х файлов main.cpp gradebook.cpp gradebook.h
Aleksey
Qt creator крутится на linux. Кто понимает, помогите 🙈
Dmitry
привет, есть вопрос
Dmitry
сейчас скопирую
Dmitry
привет. у нас тут небольшой спор касательно пространств имен и стиля программирования. предположим, у нас есть библиотека, пусть она занимается юзерами, группами, политиками и доменами. пример от балды вообще. пусть она вся обёрнута в namespace lib { }; и она оперирует некими сущностями (структуры + функции, работающие с ними), которые важны настолько, что удостоились отдельных вложенных неймспейсов. например, структуры — USER, GROUP, POLICY, DOMAIN. они могут включать в себя другие структуры из этого набора, например, GROUP включает в себя USER* со списком юзеров. неймспейсы, соответственно, lib::user, lib::group, lib::policy, lib::domain. примеры функций - lib::user::init( USER *user ), lib::user::fini( USER *user ), lib::group::add( GROUP *group, USER *user ) собственно, спор о двух подходах к оформлению этого дела. первый подход: сама структура и её функции находятся внутри неймспейса этой сущности: // user.h namespace lib::user { struct USER { }; int init( USER *user ); }; // group.h #include "user.h" namespace lib::group { // здесь приходится указывать неймспейс для юзеров struct GROUP { user::USER *users; } // и здесь тоже int add( GROUP *group, user::USER *user ); }; второй подход: структура находится в неймспейсе верхнего уровня, её функции - в нейсмпейсе сущности: // user.h namespace lib { struct USER { }; namespace user { int init( USER *user ); }; }; // group.h #include "user.h" namespace lib { // здесь НЕ приходится указывать неймспейс для юзеров struct GROUP { USER *users; } namespace group { // и здесь тоже не нужно int add( GROUP *group, USER *user ); }; }; какой подход лучше и почему?
🦥Alex Fails
привет. у нас тут небольшой спор касательно пространств имен и стиля программирования. предположим, у нас есть библиотека, пусть она занимается юзерами, группами, политиками и доменами. пример от балды вообще. пусть она вся обёрнута в namespace lib { }; и она оперирует некими сущностями (структуры + функции, работающие с ними), которые важны настолько, что удостоились отдельных вложенных неймспейсов. например, структуры — USER, GROUP, POLICY, DOMAIN. они могут включать в себя другие структуры из этого набора, например, GROUP включает в себя USER* со списком юзеров. неймспейсы, соответственно, lib::user, lib::group, lib::policy, lib::domain. примеры функций - lib::user::init( USER *user ), lib::user::fini( USER *user ), lib::group::add( GROUP *group, USER *user ) собственно, спор о двух подходах к оформлению этого дела. первый подход: сама структура и её функции находятся внутри неймспейса этой сущности: // user.h namespace lib::user { struct USER { }; int init( USER *user ); }; // group.h #include "user.h" namespace lib::group { // здесь приходится указывать неймспейс для юзеров struct GROUP { user::USER *users; } // и здесь тоже int add( GROUP *group, user::USER *user ); }; второй подход: структура находится в неймспейсе верхнего уровня, её функции - в нейсмпейсе сущности: // user.h namespace lib { struct USER { }; namespace user { int init( USER *user ); }; }; // group.h #include "user.h" namespace lib { // здесь НЕ приходится указывать неймспейс для юзеров struct GROUP { USER *users; } namespace group { // и здесь тоже не нужно int add( GROUP *group, USER *user ); }; }; какой подход лучше и почему?
Кмк лучше третий подход, когда всё вложено в неймспейс класса
Dmitry
Кмк лучше третий подход, когда всё вложено в неймспейс класса
разумеется, я согласен. но вот если без классов, то как всё-таки вменяемее?
🦥Alex Fails
А структура видна наружу, да?
Dmitry
да, видна
Dmitry
вопрос не о всех структурах, а только о тех, которые представляют собой базовые сущности, которыми оперирует либа.
Dmitry
которые даже отдельных неймспейсов удостоились
Vitaliy ◀️TriΔng3l▶️
привет. у нас тут небольшой спор касательно пространств имен и стиля программирования. предположим, у нас есть библиотека, пусть она занимается юзерами, группами, политиками и доменами. пример от балды вообще. пусть она вся обёрнута в namespace lib { }; и она оперирует некими сущностями (структуры + функции, работающие с ними), которые важны настолько, что удостоились отдельных вложенных неймспейсов. например, структуры — USER, GROUP, POLICY, DOMAIN. они могут включать в себя другие структуры из этого набора, например, GROUP включает в себя USER* со списком юзеров. неймспейсы, соответственно, lib::user, lib::group, lib::policy, lib::domain. примеры функций - lib::user::init( USER *user ), lib::user::fini( USER *user ), lib::group::add( GROUP *group, USER *user ) собственно, спор о двух подходах к оформлению этого дела. первый подход: сама структура и её функции находятся внутри неймспейса этой сущности: // user.h namespace lib::user { struct USER { }; int init( USER *user ); }; // group.h #include "user.h" namespace lib::group { // здесь приходится указывать неймспейс для юзеров struct GROUP { user::USER *users; } // и здесь тоже int add( GROUP *group, user::USER *user ); }; второй подход: структура находится в неймспейсе верхнего уровня, её функции - в нейсмпейсе сущности: // user.h namespace lib { struct USER { }; namespace user { int init( USER *user ); }; }; // group.h #include "user.h" namespace lib { // здесь НЕ приходится указывать неймспейс для юзеров struct GROUP { USER *users; } namespace group { // и здесь тоже не нужно int add( GROUP *group, USER *user ); }; }; какой подход лучше и почему?
НЕ НАДО ОРАТЬ В КОДЕ
Vitaliy ◀️TriΔng3l▶️
ДАЖЕ В КОНСТАНТАХ
🦥Alex Fails
которые даже отдельных неймспейсов удостоились
Лучше в основном, чтобы не повторяться
Dmitry
ДАЖЕ В КОНСТАНТАХ
я вообще венгр!
Dmitry
мне можно
Dmitry
Лучше в основном, чтобы не повторяться
т.е. структуры будут частью верхнеуровнего namespace lib { }
Vitaliy ◀️TriΔng3l▶️
я вообще венгр!
pUser, pGroup же тогда
Dmitry
pUser, pGroup же тогда
оно так и есть
Dmitry
только я решил не травмировать публику :)
🦥Alex Fails
ДАЖЕ В КОНСТАНТАХ
Надо, Билли, надо😂
Dmitry
всякими p, pp и lpsz
Dmitry
и dw ещё, да.
🦥Alex Fails
т.е. структуры будут частью верхнеуровнего namespace lib { }
Да, т.к. для внешнего кода они лежат внутри самой либ, и дополнительная группировка избыточна
Dmitry
да, я к этой же т.з. склоняюсь. спасибо!
Dmitry
ну и меньше пуговиц внутри кода самой либы.
Dmitry
так, и в таком случае ещё один подвопрос. допустим, USER в своём составе имеет элемент типа другой структуры, которая внутренняя для user.h и user.cpp. никем и нигде, кроме как в user.cpp, этот элемент не используется. USER_ID составной какой-нибудь. вопрос простой: выносить ли его тоже в неймспейс верхнего уровня (lib { })? или же сделать его внутри lib::user?
Anonymous
Добрый вечер. IDE Clion советует исправить bool update_fpm(int unid, std::string version) {} на bool update_fpm(int unid, const std::string &version) {}
Anonymous
Будет ли это оправдано?
vladislav
лол, ну да
vladislav
- копирование
Aidar
ну смотря что надо
Aidar
иногда нужно первое
Anatoly
Будет оправдано заменить на string_view
Aidar
не всегда
Aidar
иногда нужна прям копия
Aidar
логично сделать ее не заходя в функцию
Anonymous
Мне копия не нужна
vladislav
тогда передавай по констрефу
Anonymous
Это просто функция, которая будет вызываться из Python
Anonymous
Хотя, насколько я вижу по этому примеру с Stackoverflow, здесь без копий https://stackoverflow.com/a/9089608
Artöm
Товарищи, есть вот такая штуковина: template <char... Chars> struct metastring { }; Как её проще вывести в stream - через создание array или рекурсией посимвольно?
Если стрим типа стдшного, можно так template <char... Chars> void print(metastring<Chars...>) { print_impl(some_os, Chars...); } template <char... Chars> void print_impl(ostream&os, Chars... chars) { (os << ... << chars); }
Artöm
Я правда в сигнатуре print_impl не уверен
Artöm
Как же сложно это было с мобильного писать. Пунктуации больше, чем самих букв
Artöm
Если не скомпилируется, то так void print_impl(ostream& os, char... chars) { (os << ... << chars); }
Artöm
Без шаблона
Aidar
template <char... Chars> void print_impl(ostream&os, Chars... chars) { (os « ... « chars); } Chars не тип
Aidar
template <char... Chars> ostream& operator<<(ostream &os, metastring<Chars...>) { (os<<...<<Chars); }
Aidar
https://t.me/joinchat/BYlFbEPe5gMPVQm3OwKjaA
Igor
@antoshkka смотрю твой доклад в Иннополисе и глубоко завис на моменте с set<string, less<>> https://i.imgur.com/kQPH2VQ.png какой в этом профит по сравнению с find_if(begin, end, [&](auto &&s) { return s == p.name; })? про "иначе примера не получилось бы" понятно, интересует прирост общей производительности и каких-нибудь хитроумных оптимизаций в потрохах стдлибы потому что честно, find_if выглядит гораааздо понятнее спецификации less<> и двух дополнительных компараторов на нужный тип
Igor
линейный find_if и бинарный set::find?
Aidar
компараторы должны соответствовать
Aidar
тоесть тот что ты юзаешь для поиска не должен отличаться от того по которому построено дерево
Aidar
логически
Aidar
но он же сказал что пример ради примера
Aidar
ой, это спойлер был?
Igor
да пункт про пример ради примера я как раз понял) а вот про сложность поиска действительно упустил, спасибо
Igor
а set<string> как-то можно положить в set<string, less<>>? чтобы не возвращаемый тип функции делать "чрезмерно компарабельным", а только по месту требования?
Aidar
эт ваще отстой есличто