Не был уверен, как правильно сформулировать проблему для названия поста. Вот проблема, с которой я сталкиваюсь. У нас есть интерфейс, который будет реализован нашими LuaStateManager
класс для регистрации функций в LuaPlus::LuaState
, Проблема в том, что эти функции могут иметь любую подпись.
LuaPlus позволяет зарегистрировать любую функцию с ее LuaObject::RegisterDirect
метод. Это можно сделать, потому что он использует шаблоны. Тем не менее, мы должны заключить в капсулу LuaState
в интерфейсе, который имеет чисто виртуальные функции.
Поэтому наша идея заключалась в том, чтобы иметь функцию, которая LuaStateManager
будет реализовывать:
IScriptState::RegisterFunction( /* What should go here? */ )
Однако, как вы, вероятно, видите, нет способа указать, какой тип аргумента должен быть передан этой функции, поскольку это может быть любая сигнатура функции. Мы не можем использовать шаблоны, как LuaPlus, потому что виртуальные функции не могут быть шаблонизированы. Мы не можем шаблонировать весь LuaStateManager
класс или IScriptState
интерфейс либо потому, что для каждого переданного типа функции он будет генерировать совершенно новое состояние сценария, и ни одна из функций не будет находиться вместе.
Как такие проблемы решались в прошлом? В настоящее время мы используем метод грубой силы, который просто создает все наши экспорты в структуре, которую пользователи могут получить и заполнить. Таким образом, они будут знать, какой язык сценариев они используют, и смогут напрямую использовать LuaStateManager
вместо IScriptState
интерфейс, но это совершенно неаккуратное решение.
Задача ещё не решена.