реклама на сайте
подробности

 
 
> Растолкуйте по шаблону С++
VladislavS
сообщение Jul 24 2018, 03:31
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Помогите, плиз, устранить пробел в знаниях. Что значит второе определение Set() в этом шаблоне?

Код
template<class Regs>
class PortImplementation
{
  public:
    static void Set(uint16_t value)
    {
      Regs()->BSRR = value;
    }

    template<uint16_t value>
    static void Set()         //<--- ???
    {
      Regs()->BSRR = value;
    }
};
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dxp
сообщение Jul 25 2018, 02:15
Сообщение #2


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Функция, объявленная внутри класса и являющаяся нестатической == функция-член.
Виртуальная функция-член == метод.

В примере определены статические функции-члены шаблонного класса, одна из которых является шаблонной. Статические функции-члены по смыслу являются обычными функциями с той разницей, что имеют доступ к представлению класса. В примере определены перегруженные функции. Одна обычная - получает аргумент, вторая - по сути даёт множество функций в зависимости от параметра её шаблона. Разницу в кодогенерации показали выше. Что лучше подходит в том или ином случае, решать как всегда автору.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Jul 26 2018, 09:24
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(dxp @ Jul 25 2018, 05:15) *
Виртуальная функция-член == метод.

А вы сможете подтвердить это пунктом стандарта? Я вот сейчас поискал из любопытства - вдруг позабывал всё и не нашел.
Go to the top of the page
 
+Quote Post
dxp
сообщение Jul 26 2018, 10:22
Сообщение #4


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Kabdim @ Jul 26 2018, 16:24) *
А вы сможете подтвердить это пунктом стандарта? Я вот сейчас поискал из любопытства - вдруг позабывал всё и не нашел.

Я ждал этого вопроса. sm.gif

В стандарте С++ вообще нет термина "метод". Но зато этот термин без разбора применяют как псевдоним термина "функция-член" - очевидно потому, что это короче. Между тем, термин "метод" взят из объектно-ориентированных языков, где все объекты существуют в иерархиях и все их функции-члены по сути являются виртуальными, поэтому и являются методами. Смысл этого очень простой: когда у вас иерархия объектов, то при наследовании классы-потомки имеют "по наследству" весь набор функций-членов предков, но при этом в потоках сами эти функции могут быть перекрыты - т.е. заменены на свои, классический пример - иерархия классов геометрических фигур:

Код
Figure
    Circle
    Triangle
    Rectangle


В базовом классе есть функция-член draw(), она же по наследству попадает и в потомки. Например, функция по умолчанию умеет рисовать линии по точкам, и это хорошо подходит для треугольника и прямоугольника, но не подходит для окружности, поэтому для окружности эту функцию перекрыли - написали свою. Ясно, что и для других фигур тоже можно переписать для каждой по-своему, если это требуется. Получается, что у разных фигур разные способы нарисовать себя - свои методы сделать это!

Далее, есть сцена, на которой фигуры, и чтобы их все нарисовать, достаточно пройти по массиву указателей на них, вызвав функцию-член draw() - каждая фигура будет нарисована своим, подходящим ей способом - методом.

В реальности ровно эта задача встаёт при реализации GUI - там все виджеты сами отрисовывают себя своим способом - методом.

Вот и получается, что в чистых ОО языках все функции-члены классов всегда являются методами [выполнить действия своим способом, отличным от других методом], т.е. по сути "метод" - синоним слова "способ".

Теперь когда мы переходим к С++, который не является чистым ОО языком, а является гибридным языком, поддерживающим разные парадигмы программирования: процедурную, объектную, объектно-ориентированную, то очевидно, что далеко не все функции-члены классов являются именно методами, а только те, которые несут смысл, представленный выше. А это относится только к ОО части С++, т.е. к иерархиям наследования и их виртуальным функциям-членам, которые, безусловно, являются методами.

В книге автора языка Б. Страуструпа есть фраза: "Иногда виртуальные функции-члены называют методами".

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- VladislavS   Растолкуйте по шаблону С++   Jul 24 2018, 03:31
- - technik-1017   оптимизацию компилятора не учитываем в первом слу...   Jul 24 2018, 09:36
- - VladislavS   Спасибо, идея понятна, поэкспериментирую на досуге...   Jul 24 2018, 12:33
- - Kabdim   Потому что это не частичная специализация. Это шаб...   Jul 24 2018, 13:50
|- - VladislavS   Цитата(Kabdim @ Jul 24 2018, 16:50) Это ш...   Jul 24 2018, 14:14
- - Kabdim   метод=функция определенная в классе. Попадает он и...   Jul 24 2018, 14:41
- - VladislavS   То есть, я сам константный вызов должен сделать, ...   Jul 24 2018, 15:00
|- - Kabdim   Цитата(VladislavS @ Jul 26 2018, 12:43) ч...   Jul 27 2018, 09:15
|- - dxp   Цитата(Kabdim @ Jul 27 2018, 16:15) Да км...   Jul 27 2018, 10:05
|- - Kabdim   Цитата(dxp @ Jul 27 2018, 13:05) "Ме...   Jul 27 2018, 10:14
- - VladislavS   dxp, Спасибо. "Кто ясно мыслит, тот ясно изл...   Jul 25 2018, 02:52
|- - dxp   Цитата(VladislavS @ Jul 25 2018, 09:52) П...   Jul 25 2018, 04:59
- - VladislavS   Я думаю, что термин "метод" начали приме...   Jul 26 2018, 09:43
- - VladislavS   dxp, знаете, меня и Kabdim (мы с ним не только учи...   Jul 26 2018, 11:25
- - halfdoom   Видимо не стоит буквально переводить "method...   Jul 27 2018, 10:59
|- - dxp   Цитата(halfdoom @ Jul 27 2018, 17:59) Вид...   Jul 27 2018, 11:19
|- - halfdoom   Цитата(dxp @ Jul 27 2018, 14:19) обычные ...   Jul 27 2018, 12:00
|- - dxp   Цитата(halfdoom @ Jul 27 2018, 19:00) Так...   Jul 27 2018, 13:02
|- - halfdoom   Цитата(dxp @ Jul 27 2018, 16:02) Что-то в...   Jul 27 2018, 14:01
|- - Forger   Вставлю свои "пять копеек" Я использую ...   Aug 8 2018, 06:28
- - dxp   Ещё был случай в истории, когда в строевой подгото...   Aug 9 2018, 01:20
- - Forger   Цитата(dxp @ Aug 9 2018, 04:20) Ещё был с...   Aug 9 2018, 05:07


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 03:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.0155 секунд с 7
ELECTRONIX ©2004-2016