Дорогие друзья!
В движке PQEngine появилась возможность реализовать поддержку так называемых шаблонных классов Qt.
Шаблонный класс в C++ - это некий универсальный класс, который может работать с объектами любого типа.
В качестве примера можно взять простого представителя таких классов - контейнер QMap (он же словарь). Его аналогом в PHP является ассоциативный массив (Array), т.е. QMap – это массив значений V, ассоциированных с ключами K.
Так вот… PHP у нас язык с нестрогой типизацией, а C++ - со строгой, поэтому, создавая экземпляр класса QMap, нужно обязательно указать с какими типами будет работать данный объект.
Если бы мы захотели создать некий словарь терминов в PHP, то мы бы просто написали:
$map = [ "Картофель" => "Овощ", "Яблоко" => "Фрукт", "Малина" => "Ягода" ];
но в C++ тоже самое делается так:
QMap<QString,QString> map; // создание объекта map с типом QMap<QString,QString> map.insert("Картофель", "Овощ"); map.insert("Яблоко", "Фрукт"); map.insert("Малина", "Ягода");
т.е. здесь мы явно указываем, что ключи и значения в нашем словаре map будут иметь тип QString и никакой другой тип использовать уже нельзя. Нельзя будет написать, что "малина" - это число "123".
Это был один из примеров использования шаблонных классов, на самом деле таких классов много, из контейнеров можно перечислить следующие:
- "мультисловари" QMultiMap;
- "хеши" QHash;
- "мультихеши" QMultiHash;
- "очереди" QQueue;
- "стеки" QStack;
- "множества" QSet;
- "списки" QList и QVector
- все они имеют свои способы хранения информации и методы их обработки.
На текущий момент движок не поддерживает ни создание таких объектов, ни их передачу в качестве аргументов или возвращаемых значений, что немного сказывается на совместимости с Qt.
Вопрос реализации.
В целом, реализовать поддержку шаблонных классов вполне реально, но остается открытым вопрос синтаксиса:
QMap<QString,QString> map;
- как представить данную запись в PHP? Собственно в этом и заключается мой вопрос.
В моём видении это можно было бы записать через вызов некой специальной функции:
$map = create_template("QMap", [ "QString", "QString" ], []); // возвратит объект QMap<QString,QString> $list = create_template("QList", [ "int" ], []); // возвратит объект QList<int> // далее мы работаем с $map и $list как с обычными объектами
где:
- первый аргумент - имя шаблонного класса;
- второй аргумент - массив типов, с которыми будет работать шаблонный класс;
- третий аргумент - массив параметров конструктора, в моём случае он пуст.
Выглядит не очень красиво, поэтому я готов выслушать ваши предложения и идеи, основное условие - использовать только стандартные конструкции PHP, никакого нового синтаксиса.
Всем спасибо.
comments powered by HyperComments