Дорогие друзья!

В движке 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