artemkad 88 5 января Опубликовано 5 января · Жалоба 11 часов назад, dxp сказал: Это вот эта фигня sizeof(buf)/sizeof(buf[0] более читабельная? 🙂 Че непонятно в "размер buf деленный на размер его нулевого элемента"? Это классика для начинающих. Впрочем, цикл по всему содержимому массива полезная вещь вплоть до того, что я когда-то такое забабахал в свои Сишные проекты через #define LOOP_ARRAY(n,array) for(U8 n=0; n<(sizeof(array)/sizeof(*array)); n++ ) /// пример из примера выше int buf[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; int sum = 0; LOOP_ARRAY(i, buf) { sum += buf[i]; } А вот лямда-выражения - в топку, абсолютно интуитивно непонятный инструмент. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 6 января Опубликовано 6 января · Жалоба Вы всё еще холиварничаете? Тогда скажите, в каком-нить стандарте появилась ли частичная специализация методов шаблонного класса? То есть: template<typename T1, int N> class A { public: void Foo(); }; /* Полная специализация метода */ template<> void A<int, 0>::Foo() { } /* Хотелось бы частичную специализацию метода вот так: */ template<typename T1> void A<T1, 0>::Foo() // Но это не работает ни в каких вариантах { } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 6 января Опубликовано 6 января · Жалоба template<typename T1, int N> struct A { void Foo() { if constexpr(N==0) {} else {} } }; 7 часов назад, artemkad сказал: Че непонятно в "размер buf деленный на размер его нулевого элемента"? Это классика для начинающих. То ли дело в непонятном С++ это будет std::size(buf); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 6 января Опубликовано 6 января · Жалоба 51 минуту назад, VladislavS сказал: if constexpr(N==0) {} else {} Да это и понятно, только такой выход и остается. Либо частичная специализация всегок ласса. Но это - "же па", как говорят французы. И это еще полбеды, если параметр шаблона - просто число. А если там класс, да еще и шаблонный сам по себе. Длина записи разрастается доталова. #include <type_traits> template<typename T1, typename T2> class A { public: void Foo() { if(std::is_same<T2, int>::value) { } if(std::is_same<T2, B>::value) { } } }; Если честно, жесть. Количество букв возрастает в геометрической прогрессии... (что такое "геометрическая", знаете?) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 6 января Опубликовано 6 января · Жалоба 52 минуты назад, EdgeAligned сказал: Если честно, жесть Вы всё вывернули наизнанку. Вместо специализаций, которые непонятно как сработают, ясное и понятное программирование. Это как раз шаг вперёд к понятности и надёжности кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 88 6 января Опубликовано 6 января · Жалоба 2 часа назад, VladislavS сказал: То ли дело в непонятном С++ это будет std::size(buf); А как по мне как раз тут возможно разночтение. Первый же вопрос - это размер в байтах или число элементов buf? Судя по названию - ожидается размер... 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 6 января Опубликовано 6 января (изменено) · Жалоба А что есть в вашем понимании "ясное и понятное"? Вероятно, вы не сталкивались не деле, поэтому и не понимаете, зачем и почему. А формулировка "ясное и понятное" настолько же туманна и непонятна, как и ваше о том представление 🙂 То есть, в целом, вы согласны, что механизм специализаций шаблонов в плюсах, мягко говоря, недопилен и косячен? 🙂 А я даже больше скажу - он просто отстойный и гавенный. std::size() - это всего лишь стандартный шаблон, появившийся в ++17. Это не свойство самого языка, а всего лишь стандартная обертка, написанная на инструментарии языка. Возвращает число элементов. Ну и да, чисто лексически неоднозначно воспринимается - какой именно размер имеется ввиду. Да, недопилили, ну в С++30 подправят. Очень уж медленный прогресс идет, постоянно какие-то косяки, а исправлений приходится ждать годами. Изменено 6 января пользователем EdgeAligned Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 6 января Опубликовано 6 января · Жалоба 3 часа назад, EdgeAligned сказал: А что есть в вашем понимании "ясное и понятное"? Специализация if constexpr абсолютно однозначна и понятна. Желание специализировать методы иным способом вызывает, как минимум, недоумение. 3 часа назад, EdgeAligned сказал: std::size() - это всего лишь стандартный шаблон, появившийся в ++17. Это не свойство самого языка, Что-что? Стандартная библиотека это неотъемлемая часть языка. 3 часа назад, EdgeAligned сказал: То есть, в целом, вы согласны Не надо за меня писать. Что я считаю и с чем согласен напишу сам. Спасибо. 3 часа назад, artemkad сказал: А как по мне как раз тут возможно разночтение. Невозможно. Метод size() используется в разных контейнерах стандартной библиотеке и везде значит одно и то же. 4 часа назад, EdgeAligned сказал: std::is_same<T2, int>::value std::is_same_v<T2, int> Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 6 января Опубликовано 6 января (изменено) · Жалоба 5 часов назад, VladislavS сказал: Специализация if constexpr абсолютно однозначна и понятна. Да ну? Когда попадется у вас более чем одна и более чем в одном месте такая "специализация", почитайте, что такое "специализация шаблона" вообще и для чего оная применяется 🙂 Ну и про пример с классом, особенно шаблонным, в типе я уже говорил. 5 часов назад, VladislavS сказал: Стандартная библиотека это неотъемлемая часть языка Стандартная библиотека - это попытка решить проблемы недоработанного и, чего уж таить, сильно старого языка. И если бы для эмбедда были бы адаптированы другие языки, то С++ умер бы, как нынче умер ассемблер. Ассемблер сейчас является, по сути, лишь отладочным языком, но не языком программирования. 5 часов назад, VladislavS сказал: std::is_same_v<T2, int> inline constexpr bool is_same_v = is_same<T, U>::value; - ВСЕГО ЛИШЬ! 😄 Изменено 6 января пользователем EdgeAligned Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 6 января Опубликовано 6 января · Жалоба 27 минут назад, EdgeAligned сказал: никакого волшебства Не понимаю почему знание шаблона стандартной библиотеки воспринимается как чудо. 31 минуту назад, EdgeAligned сказал: ВСЕГО ЛИШЬ Пользуйтесь, на здоровье. Сокращает писанину. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 6 января Опубликовано 6 января (изменено) · Жалоба Ну дак я тоже не понимаю, почему вы считаете, что сокращение трех буковок - это чудо 😄 Чем больше реальных задач решаете, тем меньше "чудес"! 🙂 Потому что только в реальных кейсах будете понимать, что и как применять, и почему "лапша" вышеприведенной специализации столь ущербна, а не "ясна и понятна". Реальные кейсы дают видение алгоритмов и решений, а простое "знаю" еще ни о чем не говорит. В общем, со специализациями шаблона в С++ полная ж@па - эффективного инструмента так и не допилено. Возможно, в стандарте 30-35 года поменяют несколько буковок. Конечно, если к тому времени какой-нить современный эффективный язык не доберется до эмбедда и не отправит С++ на кладбище истории. А это вполне реально, вполне! С "железячным" языком ассемблера именно так и произошло. А ведь еще в сравнительно недавнем прошлом говорили - "если микроконтроллеры, то только на ассемблере". Ну и кто теперь с этим согласен? Изменено 6 января пользователем EdgeAligned Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 6 января Опубликовано 6 января · Жалоба On 1/6/2024 at 2:05 AM, artemkad said: /// пример из примера выше int buf[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; Зачем вообще эти безразмерные массивы ? Со строками понятно, а с данными не понятно. Задать сразу размер и не нужен будет sizeof(buf)/sizeof(buf[0]) On 1/6/2024 at 2:05 AM, artemkad said: #define LOOP_ARRAY(n,array) for(U8 n=0; n<(sizeof(array)/sizeof(*array)); n++ ) Здесь у вас ограничение на 256 элементов массива. А если их будет больше, то случится ошибка, о которой компилятор может и не сообщит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 88 6 января Опубликовано 6 января · Жалоба 3 часа назад, dimka76 сказал: Зачем вообще эти безразмерные массивы ? К примеру, могут быть таблицы заполняемые по мере развития проекта и каждый раз обновлять руками после добавления очередного элемента еще и размер как-то напрягает. 3 часа назад, dimka76 сказал: Задать сразу размер и не нужен будет sizeof(buf)/sizeof(buf[0]) По любому константа отвечающая за длину нужна Делать ее "волшебным числом" в циклах не вариант т.к. помнить о необходимости его смены при изменении размера - нарываться на ошибки. Ну и если ее создать рядом с объявлением массива, всегда есть некоторая вероятность в коде взять константу от другого массива. Потому проще будет если размер массива вычисляет сам компилятор в месте его использования. 3 часа назад, dimka76 сказал: А если их будет больше, то случится ошибка, о которой компилятор может и не сообщит. Компилятор по любому сообщит о сравнении переменной типа unsigned char с константой превышающей 255, так что в этом нет проблем. Будет что-то типа такого " pointless integer comparison, the result is always true". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 6 января Опубликовано 6 января · Жалоба Про специализацию шаблонов. Появившийся в С++17 if constexpr превратил специализацию функций и методов в привычное функциональное программирование, которое даже не воспринимается как специализация. В С++20 появились концепты, которые позволяют гибко специализировать классы. SFINAE ушёл в прошлое. Достаточно просто слезть с броневичка и пользоваться имеющимся инструментом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 6 января Опубликовано 6 января · Жалоба 8 часов назад, dimka76 сказал: Зачем вообще эти безразмерные массивы ? Со строками понятно, а с данными не понятно. ИМХО, самый правильный способ работы. Вместо дефайнов размера массива, использовать явно передаваемый в функцию размер, аргументом. А в примере с количеством элементов массива - давно сделал себе макрос, и в коде никаких глазораздирающих строк. А явно задаваемый размер массива использую только и только там, где оное действительно нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться