Шаманю с генериками и функциями

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
dedm0zaj
постоялец
Сообщения: 108
Зарегистрирован: 05.10.2012 19:55:20

Шаманю с генериками и функциями

Сообщение dedm0zaj »

ради любопытства написал такое

Код: Выделить всё

program project1;

{$mode objfpc}{$H+}

type
  generic func<TName> = function(a, b : TName) : TName;
 
  myfunc = specialize func<integer>;

var
  mymy : myfunc;

begin
  writeln(mymy(10,15));
end.


компилится и запускается. но непонятно, как написать тело функции. например я хочу, чтобы a и b складывались.
в гугле ничего не нашёл.

зы думал, что такое не скомпилится, но на удивление работает.
Free Pascal Compiler version 2.6.4 [2014/04/20] for i386
linux
Devel0
новенький
Сообщения: 66
Зарегистрирован: 24.07.2011 10:43:13

Сообщение Devel0 »

Такое пока ещё не реализовано. Можно обернуть функцию в класс:

Код: Выделить всё

generic TWrapper<T>=class
public
  class function func(a, b: T): T;
end;


Или же можно присвоить процедурной переменной конкретную специализацию: http://rosettacode.org/wiki/Generic_swap#Pascal
dedm0zaj
постоялец
Сообщения: 108
Зарегистрирован: 05.10.2012 19:55:20

Сообщение dedm0zaj »

Devel0 писал(а):Такое пока ещё не реализовано.

почему оно тогда позволяет компилить?

Devel0 писал(а):Или же можно присвоить процедурной переменной конкретную специализацию

так делал, но что толку? в итоге надо написать для каждого типа свою функцию. вообще бессмыслица.

видимо пока единственный вариант - оборачивать в класс.
Devel0
новенький
Сообщения: 66
Зарегистрирован: 24.07.2011 10:43:13

Сообщение Devel0 »

dedm0zaj писал(а):почему оно тогда позволяет компилить?

Чтобы можно было реализовать вариант номер 2 :mrgreen:
А вообще - вопрос к разработчикам компилятора, я не в курсе, какие планы по generics
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

Поддержка generic function была анонсирована ещё в 2013 году:
http://lists.freepascal.org/pipermail/f ... 32507.html

Подробности анонса весьма вкусные:
http://lists.freepascal.org/pipermail/f ... 32511.html

Но, насколько я понимаю, эта фича до сих пор не в транке :(
Ответить