Специализация шаблонов
От: evilbeaver  
Дата: 05.04.10 06:36
Оценка:
Нубский вопрос.
Есть ли в Nemerle некое подобие специализации шаблонов C++ или возможность это красиво реализовать?

Приведу пример. Есть некий дженерик ISome['a]. Он вызывается из дженерикового же метода method['a](). В частных реализациях ISome['a] (например для int) есть отличительные особенности. Сейчас приходится использовать наследование и фабрики для выбора нужного типа из иерархии.

Если шаблоны отсутствуют, то мне в голову приходит только один вариант:
При компиляции искать все места типа ISome[some_type](), смотреть есть ли в иерархии типов специализированный дженерик для данного типа some_type, и если он находится — то подставлять его вместо исходного.

Вопрос: Данный подход реализуем или это только мои мечты?
Re: Специализация шаблонов
От: hardcase Пират http://nemerle.org
Дата: 05.04.10 07:29
Оценка:
Здравствуйте, evilbeaver, Вы писали:

E>Нубский вопрос.

E>Есть ли в Nemerle некое подобие специализации шаблонов C++ или возможность это красиво реализовать?

E>Приведу пример. Есть некий дженерик ISome['a]. Он вызывается из дженерикового же метода method['a](). В частных реализациях ISome['a] (например для int) есть отличительные особенности. Сейчас приходится использовать наследование и фабрики для выбора нужного типа из иерархии.


Все упирается в систему типов .NET, которая не предусматривает создание частных реализаций генериков, поэтому в общем виде решить задачу не выйдет.


E>Если шаблоны отсутствуют, то мне в голову приходит только один вариант:

E>При компиляции искать все места типа ISome[some_type](), смотреть есть ли в иерархии типов специализированный дженерик для данного типа some_type, и если он находится — то подставлять его вместо исходного.

В этом случае гораздо проще будет сделать макрос-фабрику, но от наследования уйти не получится.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Специализация шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.04.10 11:51
Оценка:
Здравствуйте, evilbeaver, Вы писали:

E>Приведу пример. Есть некий дженерик ISome['a]. Он вызывается из дженерикового же метода method['a](). В частных реализациях ISome['a] (например для int) есть отличительные особенности. Сейчас приходится использовать наследование и фабрики для выбора нужного типа из иерархии.


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

Примером может служить Nemerle.Collections.Map[TKey, TValue] (см. Map.n):
  public class Map[TKey, TValue] : SCG.IEnumerable[TKey * TValue]
  {
    ...
    private _cmp : Node * Node -> int;
    ...
    public this()
    {
      this(0, TwoThreeTree.Node.Leaf(), DefaultComparer()); // реализация компаратора по умолчанию
    }
    ...
    public this(cmp : TKey * TKey -> int)
    {
      this(0, TwoThreeTree.Node.Leaf(), MakeNodeComparer(cmp));
    }
    ...
    public this(coll : SCG.IEnumerable [TKey * TValue], cmp : TKey * TKey -> int)
    {
      this(0, TwoThreeTree.Node.Leaf(), MakeNodeComparer(cmp), coll)
    }
    ...

Если функция не одна, можно передавать интерфейс.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Специализация шаблонов
От: evilbeaver  
Дата: 05.04.10 12:08
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Общим решением подобных задач является передача в функцию или класс функции или интерфейса которые позволили бы абстрагироваться от деталей "'a".


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

В любом случае идея с автогенерящейся фабрикой всяко лучше ручного вписывания в нее новых классов.
Re[3]: Специализация шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.04.10 12:16
Оценка:
Здравствуйте, evilbeaver, Вы писали:

E>Все бы хорошо, но опять же в методе, использующем данный объект, опять-таки придется знать, что за компаратор (в Вашем примере) ему следует передать. И опять придется использовать фабрику, правда уже не фабрику объектов, а фабрику компараторов.


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

E>В любом случае идея с автогенерящейся фабрикой всяко лучше ручного вписывания в нее новых классов.


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

В общем, приведи конкретный пример, тогда можно буде говорить конкретнее.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.