У меня есть программа, которая создает грубые типы, которые будут переопределены другой библиотекой.
Например, базовый класс с именем ScriptEng, который переопределяется библиотекой для реализации сценариев; Например Луа.
Итак, эта библиотека создает тип с именем LuaScriptEng из ScriptEng.
Во время выполнения вызывается библиотека и создается указатель на этот тип.
ScriptEng* script = LoadClassFromLibrary("LuaScriptEng.dll","LuaScriptEng");
Или
ScriptEng* script = LoadClassFromLibrary("SqurrelScript.dll","SqurrelScriptEng");
Проблема возникает, когда я пытаюсь передать другие методы класса этому экземпляру для воздействия на этот встроенный язык.
Game* game = new Game(); //contains stuff.
auto game_bind = script->createClass<Game>("Game", game);
game_bind->bindMethod("helo", &Game::hello);
Это работает хорошо до тех пор, пока мне не придется переопределять методы класса в классе LuaScriptEng.
class ScriptEng
{
public:
ScriptEng();
template<class T>
ScriptClass<T>* createClass(const std::string& name,T* cla)
{
//Implement per engine information here in children
return new ScriptClass<T>(cla);
}
virtual bool callFunction(const std::string& name)
{
return true;
}
virtual ~ScriptEng();
};
Поскольку в этом смысле невозможно иметь «виртуальную» функцию шаблона.
Я не могу обойтись без этого, если, конечно, я не создаю десятки статических функций и вместо того, чтобы связывать класс по частям, я использую их вместо этого.
Я пытаюсь представить функции для языка сценариев, чтобы было проще понять типы вызовов, такие как
Game.somefunction(); //From lua or some other lang, call the current instance of this function.
Теперь идея обходного пути, которая у меня есть, вероятно, сработает, но она действительно грязная.
Из того, что я прочитал, оберточные обобщения в этом случае были бы "Стирание типа", но при этом я смотрю где-то рядом с 5-9 вызовами функций на один вызов скрипта, которые ДЕЙСТВИТЕЛЬНО приводят к остановке программы.
Что может быть лучше, чем это?