Как написать универсальную функцию сравнения в Haxe (haxe3)

Я пытаюсь написать универсальную функцию сравнения (например, c strcmp) в Haxe3 для шаблона типа A, предполагая, что этот тип шаблона имеет оператор меньше чем или равен "<=".

Я видел в документации по Haxe3 (http://haxe.org/manual/haxe3/features) что вы можете сделать аналогичную работу, если хотите предположить, что тип шаблона имеет новую функцию:

@:generic static function foo<T:{function new(s:String):Void;}>(t:T) {
    trace(Type.typeof(t)); // TClass([class String]) / TClass([class Template])
    return new T("foo");
}

Итак, я попробовал ту же технику с функцией "le":

class Main {
    @:generic static public function compare_<A:{function le(y:A):Bool;}>(x:A,y:A): Int {
        if (x.le(y) && y.le(x)) return 0;
        else if (x.le(y)) return -1;
        else return 1;
    }


    static function main() {
        var a:MyInt  = new MyInt(1);
        var b:MyInt  = new MyInt(2);
        trace(compare_(a,b));
    }
}

class MyInt {
    var data:Int;
    public function new(i:Int) {this.data = i; }
    public function le(y:MyInt){return data <= y.data;}
}

Приведенная выше функция сравнения отлично работает для любого типа с обязательной функцией "le". Приведенный выше код возвращает -1, как и ожидалось. Но, очевидно, довольно неудобно создавать новый класс для Int, просто чтобы обеспечитьle функция. У меня вопрос, есть ли способ переписать функцию compare_, чтобы она работала для любого типа шаблона (Int, Float, другие типы с перегруженными операторами) с определенным оператором «<=»?

Вот что я попробовал:

@:generic static public function compare_<A:{@:op(X <= Y) function le(x:A,y:A):Bool;}>(x:A,y:A): Int {
     if (x <= y && y <= x) return 0;
     else if (x <= y) return -1;
     else return 1;
 }

который, конечно, не компилируется. Хэкс жалуется, что «le» не определено.

Я ищу легковесные решения без участия макросов, так как я намерен повторно использовать сгенерированный haxe код на других языках без зависимости от Boot. или scuts. Динамический также не подходит для моих целей, так как здесь нет никакой безопасности типов.

Заранее спасибо.

Обновление: я сделал дополнительное чтение и подумал, что смогу ввестиle метод трудный путь в каждый тип, который я хочу, используяusing а такжеcallback механизм. Пожалуйста, смотрите мой связанный вопрос по этому вопросу«импорт и использование могут не отображаться после объявления типа».

Ответы на вопрос(1)

Ваш ответ на вопрос