Дякую за чудовий урок! На скільки я зрозумів, то "шаблон функції " в C++ працює так само, як і Generics в Java? Вивчав Джаву в універі і ця концепція видалась дуже знайомою.
1. Якщо у вас є шаблон функції, то ніяких функцій генеруватися не буде, якщо ви ніде не викликали шаблон такої функції. 2. Якщо в коді все таки є виклик, то на етапі КОМПІЛЯЦІЇ генерується функція. 3. Явна спеціалізація суті не міняє. Якщо ні разу не викликаєте - не буде функції. Якщо викликаєте - сгенерується на етапі компіляції.
Для вирішення проблеми , який тип повертати, можна просто написати слово auto, наприклад auto Sum(T1 a, T2 b); Можна не вказувати хвостовий тип, і так працює Чи взагалі чи є сенс додавати два різні типи? Це працює з числами, з іншими типами немає сенсу
Про ключове слово auto є окремий урок. Перед тим як писати такі коментарі (а це уже у вас другий такий коментар) задумайтеся над тим, що можливо такі теми уже піднімаються на моєму каналі в наступних уроках. На рахунок хвостового типу - так буде працювати лише при використанні ключового слова auto і стандарту C++14 і вище. Додавання різних типів - це лише простий приклад того, як можна скомпілювати операцію (не обов'язково додавання) над різними типами завдяки компілятору. Ви не бачите сенсу в додаванні, ок. От вам один із сенсів: додайте об'єкт класу Matrix до об'єкту класу Vector. Це два різних класи, які не вбудовані в С++ бібліотеку.
@@BloganProgramming C++14 по замовчування саме цей стандарт встановлено у студії 2022, меншого немає Matrix + Vector це поодинокий випадок, не потрібно писати шаблон. Достатньо звичайної функції sum чи operator+
Доброго дня! є функція void someFunct(int g, int y, int r, int b) { // ... do something } є код з викликом функції int Args[4] = { 0, 1, 0, 0 }; // init array with 4 elements auto [g, y, r, b] = Args; // unpack array to a variables someFunct(g, y, r, b); // call function using a variables Питання: як зробити unpack безпосередньо під час виклику функції ? тобто щоб було приблизно так (написано невірно, але з ціллю передати суть) someFunct(auto [g, y, r, b] = Args); або someFunct(...Args);
Доброго здоров'я. Підкажіть як приймати в перенавантажену функцію тільки контейнери STL? Приклад перенавантаженої функції нижче, одна має приймати контейнери а друга все інше. // приймає вектор а треба і map і лист і інші контейнери. template bool write(std::vector &data) {return true; } //приймає все крім вектора. А треба все крім STL контейнерів. template bool write( T &data) {return true;}
Відповідь на перше питання: template bool write(Container& data) { return true; } Відповідь на друге питання: 1. По-перше ваша функція приймає вектор. Тому я не розумію, з чого ви взяли, що вона приймає все крім вектора. 2. По-друге якщо вам так хочеться, щоб функція не приймала всі контейнери, то вам треба буде прописувати вручну наступне: template bool write(std::vector& data) = delete; template bool write(std::list& data) = delete; template bool write(std::deque& data) = delete; template bool write(std::set& data) = delete; І так далі.
@@BloganProgramming Дякую за відповідь! Я мабудь невірно коментарії написав. Верхня функція має обробляти контейнери а нижня все інше. Ціль - зберігати у файл змінні які можуть бути як звичайна змінна типу int так і вектор структур чи інший контейнер. Змінна просто записується у файл а по контейнеру треба пройтись циклом і почергово перепесати кожен елемент. Пробую створити загальну функцію для контейнерів. Чат gpt підказує що можно перевіряти тип даних перед функцією, та поки що не компілюється його варіант. Вчуся програмувати мікроконтроллер, трохи відрізняється запис файлів від ПК.
Добрий день, Деміен. Будь ласка залиште карту монобанку для можливості віддячити. Я намагався зайти з ноутбука і з телефону по посиланню і пише помилка, коли намагаюсь зробити платіж.
Просто пишу комент, бо подобається контент
Дякую.
ваш канал, це дуже користна річ ! Схоже на те що я з вами на довго.
Радий це чути.
Дякую за урок.
Будь ласка.
4:09 щось впало))
То пам'ять відвалилася)
Дякую! 👍
Будь ласка.
Підписалося 700 користувачі. Мої вітання з маленьким ювілеєм :)
Дякую. Він не маленький.
Трохи тяжка тема , 3 рази передивлявся поки все зрозумів
Це дійсно важка тема. Спробуйте її також погуглити в інших джерелах. Допоможе.
дуже не вистачає практичних уроків, набагато ваще запамятовується інформація без них. Хоча відео по теорії прекрасні, все зрозуміло)
Це уже не проблема відсутності практики, а ваша)
Дякую за чудовий урок! На скільки я зрозумів, то "шаблон функції " в C++ працює так само, як і Generics в Java?
Вивчав Джаву в універі і ця концепція видалась дуже знайомою.
Приблизно так само.
👍
підскажи будь ласка - функція генерується з шаблону під час компіляції або під час виконання програми? Таке ж питання для явної спеціалізації
Дякую
1. Якщо у вас є шаблон функції, то ніяких функцій генеруватися не буде, якщо ви ніде не викликали шаблон такої функції.
2. Якщо в коді все таки є виклик, то на етапі КОМПІЛЯЦІЇ генерується функція.
3. Явна спеціалізація суті не міняє. Якщо ні разу не викликаєте - не буде функції. Якщо викликаєте - сгенерується на етапі компіляції.
треба ще зробити телеграм канал
Я не настільки популярний і активний, щоб заводити телеграм канал.
@@BloganProgramming та ну, заведи)))
Для вирішення проблеми , який тип повертати, можна просто написати слово auto, наприклад auto Sum(T1 a, T2 b);
Можна не вказувати хвостовий тип, і так працює
Чи взагалі чи є сенс додавати два різні типи? Це працює з числами, з іншими типами немає сенсу
Про ключове слово auto є окремий урок. Перед тим як писати такі коментарі (а це уже у вас другий такий коментар) задумайтеся над тим, що можливо такі теми уже піднімаються на моєму каналі в наступних уроках.
На рахунок хвостового типу - так буде працювати лише при використанні ключового слова auto і стандарту C++14 і вище.
Додавання різних типів - це лише простий приклад того, як можна скомпілювати операцію (не обов'язково додавання) над різними типами завдяки компілятору. Ви не бачите сенсу в додаванні, ок. От вам один із сенсів: додайте об'єкт класу Matrix до об'єкту класу Vector. Це два різних класи, які не вбудовані в С++ бібліотеку.
@@BloganProgramming
C++14 по замовчування саме цей стандарт встановлено у студії 2022, меншого немає
Matrix + Vector це поодинокий випадок, не потрібно писати шаблон. Достатньо звичайної функції sum чи operator+
Доброго дня!
є функція
void someFunct(int g, int y, int r, int b) {
// ... do something
}
є код з викликом функції
int Args[4] = { 0, 1, 0, 0 }; // init array with 4 elements
auto [g, y, r, b] = Args; // unpack array to a variables
someFunct(g, y, r, b); // call function using a variables
Питання:
як зробити unpack безпосередньо під час виклику функції ?
тобто щоб було приблизно так (написано невірно, але з ціллю передати суть)
someFunct(auto [g, y, r, b] = Args);
або
someFunct(...Args);
Так робити не можна. Але можливо вам допоможе урок "Варіативні шаблони".
Мається на увазі в c++ технічно не можливо так зробити?
@@ОлексійІвахненко-ь5п Такого коду я не бачив.
Доброго здоров'я. Підкажіть як приймати в перенавантажену функцію тільки контейнери STL?
Приклад перенавантаженої функції нижче, одна має приймати контейнери а друга все інше.
// приймає вектор а треба і map і лист і інші контейнери.
template
bool write(std::vector &data) {return true; }
//приймає все крім вектора. А треба все крім STL контейнерів.
template
bool write( T &data) {return true;}
Відповідь на перше питання:
template
bool write(Container& data) { return true; }
Відповідь на друге питання:
1. По-перше ваша функція приймає вектор. Тому я не розумію, з чого ви взяли, що вона приймає все крім вектора.
2. По-друге якщо вам так хочеться, щоб функція не приймала всі контейнери, то вам треба буде прописувати вручну наступне:
template
bool write(std::vector& data) = delete;
template
bool write(std::list& data) = delete;
template
bool write(std::deque& data) = delete;
template
bool write(std::set& data) = delete;
І так далі.
@@BloganProgramming Дякую за відповідь! Я мабудь невірно коментарії написав. Верхня функція має обробляти контейнери а нижня все інше. Ціль - зберігати у файл змінні які можуть бути як звичайна змінна типу int так і вектор структур чи інший контейнер. Змінна просто записується у файл а по контейнеру треба пройтись циклом і почергово перепесати кожен елемент. Пробую створити загальну функцію для контейнерів. Чат gpt підказує що можно перевіряти тип даних перед функцією, та поки що не компілюється його варіант. Вчуся програмувати мікроконтроллер, трохи відрізняється запис файлів від ПК.
Добрий день, Деміен.
Будь ласка залиште карту монобанку для можливості віддячити. Я намагався зайти з ноутбука і з телефону по посиланню і пише помилка, коли намагаюсь зробити платіж.
Доброго дня. Карту я скидати точно не буду, але можете спробувати ще це посилання. Це донатна сторінка мого іншого каналу. ko-fi.com/blogan
перевантаження*
перезавантаження*
Уроки класні , але не можливо слухати з-за музики.
Так, в перших десятках уроків музика буває гучною. Тим не менш слова все одно можна розібрати. Якщо вам важливі знання, то ви все зможете почути.
* короче,це буде не легко...
* Короче,є така штука як ШАБЛОНИ ФУНКЦІЙ
* Синтаксис: template