Перейти к содержанию
    

Стили оформления программ на C/C++ и их применимость

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];
}

А вот лямда-выражения  - в топку, абсолютно интуитивно непонятный инструмент.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы всё еще холиварничаете? Тогда скажите, в каком-нить стандарте появилась ли частичная специализация методов шаблонного класса? То есть:

template<typename T1, int N>
class A {
public:
	void Foo();
};
 
/* Полная специализация метода */
template<>
void A<int, 0>::Foo()
{
}
  
/* Хотелось бы частичную специализацию метода вот так: */
template<typename T1>
void A<T1, 0>::Foo() // Но это не работает ни в каких вариантах
{
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

template<typename T1, int N>
struct A 
{
  void Foo()
  { 
    if constexpr(N==0) {} else {}  
  }	
};

 

7 часов назад, artemkad сказал:

Че непонятно в "размер buf деленный на размер его нулевого элемента"? Это классика для начинающих.

То ли дело в непонятном С++ это будет std::size(buf);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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)
		{
		}
	}
};

Если честно, жесть. Количество букв возрастает в геометрической прогрессии... (что такое "геометрическая", знаете?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

52 минуты назад, EdgeAligned сказал:

Если честно, жесть

Вы всё вывернули наизнанку. Вместо специализаций, которые непонятно как сработают, ясное и понятное программирование. Это как раз шаг вперёд к понятности и надёжности кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, VladislavS сказал:

То ли дело в непонятном С++ это будет std::size(buf);

А как по мне как раз тут возможно разночтение. Первый же вопрос -  это размер в байтах или число элементов buf? Судя по названию - ожидается размер...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что есть в вашем понимании "ясное и понятное"? Вероятно, вы не сталкивались не деле, поэтому и не понимаете, зачем и почему. А формулировка "ясное и понятное" настолько же туманна и непонятна, как и ваше о том представление 🙂 
То есть, в целом, вы согласны, что механизм специализаций шаблонов в плюсах, мягко говоря, недопилен и косячен? 🙂 А я даже больше скажу - он просто отстойный и гавенный.

std::size() - это всего лишь стандартный шаблон, появившийся в ++17. Это не свойство самого языка, а всего лишь стандартная обертка, написанная на инструментарии языка. Возвращает число элементов. Ну и да, чисто лексически неоднозначно воспринимается - какой именно размер имеется ввиду. Да, недопилили, ну в С++30 подправят. Очень уж медленный прогресс идет, постоянно какие-то косяки, а исправлений приходится ждать годами.

Изменено пользователем EdgeAligned

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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>

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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; - ВСЕГО ЛИШЬ! 😄

Изменено пользователем EdgeAligned

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 минут назад, EdgeAligned сказал:

никакого волшебства

Не понимаю почему знание шаблона стандартной библиотеки воспринимается как чудо. 

31 минуту назад, EdgeAligned сказал:

ВСЕГО ЛИШЬ

Пользуйтесь, на здоровье. Сокращает писанину.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну дак я тоже не понимаю, почему вы считаете, что сокращение трех буковок - это чудо 😄 Чем больше реальных задач решаете, тем меньше "чудес"! 🙂 Потому что только в реальных кейсах будете понимать, что и как применять, и почему "лапша" вышеприведенной специализации столь ущербна, а не "ясна и понятна". Реальные кейсы дают видение алгоритмов и решений, а простое "знаю" еще ни о чем не говорит.

В общем, со специализациями шаблона в С++ полная ж@па - эффективного инструмента так и не допилено. Возможно, в стандарте 30-35 года поменяют несколько буковок. Конечно, если к тому времени какой-нить современный эффективный язык не доберется до эмбедда и не отправит С++ на кладбище истории. А это вполне реально, вполне! С "железячным" языком ассемблера именно так и произошло. А ведь еще в сравнительно недавнем прошлом говорили - "если микроконтроллеры, то только на ассемблере". Ну и кто теперь с этим согласен? 

Изменено пользователем EdgeAligned

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 элементов массива.

А если их будет больше, то случится ошибка, о которой компилятор может и не сообщит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, dimka76 сказал:

Зачем вообще эти безразмерные массивы ?

К примеру, могут быть таблицы заполняемые по мере развития проекта и каждый раз обновлять руками после добавления очередного элемента  еще и размер как-то напрягает.

3 часа назад, dimka76 сказал:

Задать сразу размер и не нужен будет 

sizeof(buf)/sizeof(buf[0])

По любому константа отвечающая за длину нужна Делать ее "волшебным числом" в циклах не вариант т.к. помнить о необходимости его смены при изменении размера - нарываться на ошибки. Ну и если ее создать рядом с объявлением массива, всегда есть некоторая вероятность в коде взять константу от другого массива. Потому проще будет если размер массива  вычисляет сам компилятор в месте его использования.

3 часа назад, dimka76 сказал:

А если их будет больше, то случится ошибка, о которой компилятор может и не сообщит.

Компилятор по любому сообщит о сравнении переменной типа unsigned char с константой превышающей 255, так что в этом нет проблем. Будет что-то типа такого " pointless integer comparison, the result is always true".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про специализацию шаблонов. Появившийся в С++17 if constexpr превратил специализацию функций и методов в привычное функциональное программирование, которое даже не воспринимается как специализация. В С++20 появились концепты, которые позволяют гибко специализировать классы. SFINAE ушёл в прошлое. Достаточно просто слезть с броневичка и пользоваться имеющимся инструментом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, dimka76 сказал:

Зачем вообще эти безразмерные массивы ?
Со строками понятно, а с данными не понятно.

ИМХО, самый правильный способ работы. Вместо дефайнов размера массива, использовать явно передаваемый в функцию размер, аргументом. А в примере с количеством элементов массива - давно сделал себе макрос, и в коде никаких глазораздирающих строк. А явно задаваемый размер массива использую только и только там, где оное действительно нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...