Пример применения шаблона в FreeBasic
|
|
haav | Дата: Вторник, 16.10.2012, 06:58 | Сообщение # 1 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Пример применения шаблона в FreeBasic
Хороший пример, показывающий реализацию шаблона для структуры. Я уже не раз применял шаблоны в своих кодах, только для функций.
Автор: MOD
Code 'Template #Macro vectorDummy ( T ) 'Macro zur Definition des Templates #Ifndef vector##T 'Verhindert doppelte Definitionen Type vector##T 'Eigentliche Klasse As T X , Y , Z 'Beispiel-Records End Type #EndIf #EndMacro
vectorDummy ( Integer ) 'Klasse fur den Typ Integer anlegen Dim As vectorInteger meinVector1 meinVector1.X = 5
vectorDummy ( String ) 'Klasse fur den Typ String anlegen Dim As vectorString meinVector2 meinVector2.X = "Hallo"
Print meinVector1.X Print meinVector2.X
Sleep
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Vitamin | Дата: Вторник, 30.05.2017, 20:44 | Сообщение # 2 |
Лейтенант
Группа: Пользователи
Сообщений: 59
Статус: Offline
| А как реализовать шаблон для функции и для объекта?
Сообщение отредактировал Vitamin - Вторник, 30.05.2017, 21:36 |
|
| |
haav | Дата: Среда, 31.05.2017, 07:33 | Сообщение # 3 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Вот например:
Код Dim Shared As Integer iDim(5) Dim Shared As String sDim(5)
#Macro t (mtype,pref) Sub addvalue##pref(pref As mtype) Static ic As Integer pref##Dim(ic) = pref ic+=1 If ic>5 Then ic = 0 End Sub #EndMacro
t(String,s) t(Integer,i)
' ТЕСТ For i As Integer = 0 To 5 addvaluei(i) Next
For i As Integer = 0 To 5 addvalues("string =" & i) Next
For i As Integer = 0 To 5 ? iDim(i) Next
For i As Integer = 0 To 5 ? sDim(i) Next
Sleep
Конечно данный пример не имеет практического смысла , но для понимания думаю пойдет. Лично я применял шаблоны функций тогда, когда исходник разрастался в объеме одинаковым кодом. Например мне нужна была сортировка для разных типов. По сути сам код сортировки для разных типов практически не менялся, лишь пару строк в нем различались. Там просто напрашивались шаблоны, чтобы сократить размер исходника. В итоге вместо ~100 строк, я получал меньше 40.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Vitamin | Дата: Среда, 31.05.2017, 12:03 | Сообщение # 4 |
Лейтенант
Группа: Пользователи
Сообщений: 59
Статус: Offline
| Спасибо за пример. Немного поэкспериментировал с шаблоном для объекта, если кому интересно вот пример: Код #Macro Vektor (T) ' Создание подстановочных типов #Ifndef Vektor##T ' проверка, что такой тип Тип еще не был создан
' создаём объект с указанным именем Type Vektor##T ' декларация типа; имя типа получатся слиянием строк i As ##T Declare Sub test (zn As ##T) ' декларация процедуры вывода End Type Sub Vektor##T.test (zn As ##T) ' тело процедуры вывода ? zn End Sub #EndIf #EndMacro ' ---------------------------------------------------------------
Type MY As String ' пользовательский тип
Vektor (MY) ' создаём Вектор-Тип с пользовательским Типом "MY" в теле Dim As VektorMY meinVector3 meinVector3.i = " S" : Print meinVector3.i ' ввод/вывод в новый объект ?"Sub = "; : meinVector3.test ("5w") ' процедура вывода "MY" ? Vektor (Long) ' создаём Вектор-Тип с Типом "Long" в теле Dim As VektorLong meinVector4 meinVector4.i = 1 : Print meinVector4.i ' ввод/вывод в новый объект ?"Sub = "; : meinVector4.test (6) ' процедура вывода "Long"
Sleep
Сообщение отредактировал Vitamin - Четверг, 01.06.2017, 18:30 |
|
| |
DarkDemon | Дата: Пятница, 02.06.2017, 13:43 | Сообщение # 5 |
Полковник
Группа: Друзья
Сообщений: 194
Статус: Offline
| Эти фичи упрощают код только для пишущего код, для читающего сильно усложняют - имхо. В целом макросы интересная вещь, но в своих проектах применять сложные(неоднострочные) макросы бы точно не стал.
|
|
| |
Vitamin | Дата: Пятница, 02.06.2017, 21:01 | Сообщение # 6 |
Лейтенант
Группа: Пользователи
Сообщений: 59
Статус: Offline
| В любом приёме есть как свои плюсы, так и минусы. Подобные макросы как раз призваны не для облегчения чтения кода (хотя особых проблем здесь нет), а для борьбы с дубликатами целых блоков кода из-за какого-то разнотипного определения. Хотя и с небольшими выражениями можно бороться. Например зачем писать Integer, когда можно написать In (в С++ Int). Вот небольшой пример: Код #Define Pauza(Sek) Sleep Sek##000' Пауза(сек) пауза задаётся целыми секундами
' Псевдонимы для стандартных Типов #Define Bt Byte #Define UBt UByte #Define Sh Short #Define USh UShort #Define Ln Long #Define ULn ULong #Define In Integer #Define UIn UInteger #Define LnI LongInt #Define ULnI ULongInt #Define Sng Single #Define Dbl Double #Define St String #Define WSt WString #Define ZSt ZString
' Псевдоним для объявлений Типов #Define Dm Dim As
' Псевдоним для деклараций #Define Dec Declare
Dm In i ' = Dim As Integer i Pauza(2) ' Пауза 2 сек
Сообщение отредактировал Vitamin - Суббота, 03.06.2017, 11:36 |
|
| |
haav | Дата: Суббота, 03.06.2017, 10:30 | Сообщение # 7 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата Vitamin ( ) Хотя и с небольшими выражениями можно бороться. Например зачем писать Integer, когда можно написать In (в С++ Int). Так-то так, главное самому потом не запутаться
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |