Что касается тега cpp. Этот шаблон в основном относится к параметризации и может быть реализован на C ++ с помощью шаблонов. Мой основной вопрос заключается в том, является ли это логически разрешимым шаблоном (который, я считаю, не соответствует указанному) в C ++ и AVM2, с предпочтением решить его с помощью haxe. Конкретный пример кода и запрос в целом, написанные на Haxe, компилируются в соответствующую цель C ++ логически идентичным образом.
Я спрашиваю, есть ли исправление для этого шаблона с:
next
член)Вопрос:
Казалось бы, что нет способа определить параметризованный пул для Class
который простирается от Class
что само объединено, потому что подкласс не может соответствовать Poolable_i
интерфейс, потому что он не может переопределить next
имущество. Это верный вывод?
То есть:
Pool_pointer<Destination>
не может существовать, потому чтоDestination
не может соответствовать никаким полезным ограничениям, указанным вPool_pointer<Destination>
Например:
Poolable_i<T> is a base that hase a single property next:T
Point3d implements Poolable_i<Point3d>
Destination extends Point3d {
public var time:Time;
}
Это также предполагает, что вы не хотите использовать базовый класс, который сам параметризован, например, Point3d_base<T:{Poolable_i<T>,Point3d_base}>
потому что может потребоваться иерархия с глубиной больше 1.
Конечно, это может быть решено несколькими способами с помощью предварительной обработки, как я собираюсь сделать. Мне просто любопытно, если я что-то упускаю из-за невозможности упомянутой реализации шаблонов.
package test.shared;
class Pool_pointer<T:Poolable_i<T>> implements Pool_i<T> {
public var free:T;
public function new() {
}
public function destroy():Void {
}
public inline function get():T {
var r:T=null;
if(free==null) {
r=new T();
} else {
r=free;
free=r.next;
}
return r;
}
public inline function put(v:T):Void {
v.next=free;
free=v;
}
}
Решение заключается в параметризации всей иерархии в отношении объявлений функциональности и создании typedefs / специфических классов для конкретных реализаций.
Destination_base<NextT> -> Destination extends Destination_base<Destination>
^
|
Point3d_base<NextT> -> Point3d extends Point3d_base<Point3d>
Иерархия реализации параметризована. Тьфу. Люблю твою первичную обработку.
Других решений пока нет …