|
Растолкуйте по шаблону С++ |
|
|
|
Jul 24 2018, 03:31
|
Местный
  
Группа: Свой
Сообщений: 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; } };
|
|
|
|
|
 |
Ответов
|
Jul 26 2018, 10:22
|

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

|
Цитата(Kabdim @ Jul 26 2018, 16:24)  А вы сможете подтвердить это пунктом стандарта? Я вот сейчас поискал из любопытства - вдруг позабывал всё и не нашел. Я ждал этого вопроса.  В стандарте С++ вообще нет термина "метод". Но зато этот термин без разбора применяют как псевдоним термина "функция-член" - очевидно потому, что это короче. Между тем, термин "метод" взят из объектно-ориентированных языков, где все объекты существуют в иерархиях и все их функции-члены по сути являются виртуальными, поэтому и являются методами. Смысл этого очень простой: когда у вас иерархия объектов, то при наследовании классы-потомки имеют "по наследству" весь набор функций-членов предков, но при этом в потоках сами эти функции могут быть перекрыты - т.е. заменены на свои, классический пример - иерархия классов геометрических фигур: Код Figure Circle Triangle Rectangle В базовом классе есть функция-член draw(), она же по наследству попадает и в потомки. Например, функция по умолчанию умеет рисовать линии по точкам, и это хорошо подходит для треугольника и прямоугольника, но не подходит для окружности, поэтому для окружности эту функцию перекрыли - написали свою. Ясно, что и для других фигур тоже можно переписать для каждой по-своему, если это требуется. Получается, что у разных фигур разные способы нарисовать себя - свои методы сделать это! Далее, есть сцена, на которой фигуры, и чтобы их все нарисовать, достаточно пройти по массиву указателей на них, вызвав функцию-член draw() - каждая фигура будет нарисована своим, подходящим ей способом - методом. В реальности ровно эта задача встаёт при реализации GUI - там все виджеты сами отрисовывают себя своим способом - методом. Вот и получается, что в чистых ОО языках все функции-члены классов всегда являются методами [выполнить действия своим способом, отличным от других методом], т.е. по сути "метод" - синоним слова "способ". Теперь когда мы переходим к С++, который не является чистым ОО языком, а является гибридным языком, поддерживающим разные парадигмы программирования: процедурную, объектную, объектно-ориентированную, то очевидно, что далеко не все функции-члены классов являются именно методами, а только те, которые несут смысл, представленный выше. А это относится только к ОО части С++, т.е. к иерархиям наследования и их виртуальным функциям-членам, которые, безусловно, являются методами. В книге автора языка Б. Страуструпа есть фраза: "Иногда виртуальные функции-члены называют методами". Относиться к ситуации можно по-разному, и много людей просто кладут на аргументацию и не дают себе труда ни разобраться, ни следовать этому - для них "метод" просто удобнее, потому что короче. Кто-то просто не в курсе дела, а в книжках и на форумах пишут "метод", вот они и повторяют. Но я считаю, что терминологическая точность должна быть, иначе начинает теряться просто смысл терминологии, поэтому лучше не лениться и называть вещи правильно.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jul 27 2018, 09:15
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(VladislavS @ Jul 26 2018, 12:43)  чтобы немного облагородить ругательство "функция-член". Да кмк здесь слово метод более употребительно чем там, но и там оно тоже используется. Цитата(dxp @ Jul 26 2018, 13:22)  Вопрос на самом деле неоднозначный. Вот к примеру есть PPP Style Guide, в котором Страуструп пишет на 9 странице: Цитата Not every member function (”method”) should be virtual and by default they are not Из-за чего так? Кмк потому что методы вошли в общепринятую терминологию позже плюсов. К тому же вошли в двух разных школах. В ораклово-явовской метод=вирутальная функция член, в майкрософто-решеточной (и дельфевской из которой решетка переняла многое) метод просто функция в классе. Поэтому прошу не утверждать что есть единая верная интерпретация. Вообще в оригинале абстрактного ОО (Smalltalk) метод диспетчеризуется по имени, о чем (и вообще о философии ОО применительно к плюсам) Страуструп рассуждает в What is ‘‘Object-Oriented Programming’’ - рекомендую прочитать.
|
|
|
|
|
Jul 27 2018, 10:05
|

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

|
Цитата(Kabdim @ Jul 27 2018, 16:15)  Да кмк здесь слово метод более употребительно чем там, но и там оно тоже используется. Я вижу, вам тоже оно нравится (более коротко и/или привыкли). Цитата(Kabdim @ Jul 27 2018, 16:15)  Из-за чего так? Кмк потому что методы вошли в общепринятую терминологию позже плюсов. "Метод" (как и ООП) появился куда раньше плюсов. Обратите внимание, он говорит про Java и взял в кавычки, подчёркивая, что в плюсах далеко не все функции-члены являются методами. Цитата(Kabdim @ Jul 27 2018, 16:15)  К тому же вошли в двух разных школах. В ораклово-явовской метод=вирутальная функция член, в майкрософто-решеточной (и дельфевской из которой решетка переняла многое) метод просто функция в классе. Поэтому прошу не утверждать что есть единая верная интерпретация. Я ничего не утверждаю. Ну, разве что то, что термина "метод" в С++ нет вообще. Есть функция, функция-член, статическая функция-член, виртуальная функция-член. На последнюю можно отмапить термин "метод", переходя на ОО терминологию. Но тащить её дальше и обобщать - это как-то слишком. Цитата(Kabdim @ Jul 27 2018, 16:15)  Вообще в оригинале абстрактного ОО (Smalltalk) метод диспетчеризуется по имени, о чем (и вообще о философии ОО применительно к плюсам) Страуструп рассуждает в What is ‘‘Object-Oriented Programming’’ - рекомендую прочитать. Вот если вы пройдёте по вхождениям словам "method", то убедитесь, что Страуструп очень аккуратно использует терминологию, употребляя этот термин именно как синоним виртуальной функции-члена, например (стр. 20): Цитата This idea captures only part of the expressive power of inheritance, but it is strongly encouraged by languages where every member function is virtual (or a method).
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
Сообщений в этой теме
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 Цитата(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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|