squirrel — c ++ sqrat методы привязки через оболочку

Я пытаюсь разработать оболочку для привязки Squirrel VM и SQRat

Обычный способ связывания класса заключается в вызове:

Class<MyClass> myClass(vm,"myClass");
myClass.Func(_SC("Foo"), &MyClass::Foo);

Где класс, который я пытаюсь связать, выглядит так:

class MyClass {
public:
void Foo() { cout << bar; }
int bar;
};

Теперь iv Обернутая белка в вспомогательный класс, который обрабатывает состояние машины и ошибки, называемые SqEnvironment.

class SqEnvironment
{
public:
SqEnvironment(unsigned int stacksize); //set up enviroment add callbacks ext.
template<class T>
SqurrelClass<T> bindClass(string classname);
HSQUIRRELVM v;
}

template<class T>
SqurrelClass<T> SqEnvironment::bindClass(string classname)
{
return SqurrelClass<T>(classname,v);
}

Вызов метода bindclass в основном выглядит так:

int main(int argc, char* argv[])
{
SqEnvironment e(1024);

SqurrelClass<MyClass> myclass = e.bindClass<MyClass>("MyClass");
myclass.bindFunction(&MyClass::Foo,"Foo"); //No idea.

cin.get();
return 0;
}

Я просто не могу понять реализацию метода связывания.

template<class T>
class SqurrelClass
{
public:
SqurrelClass(std::string classname, HSQUIRRELVM v);
void bindFunction(void (T::*mymethod), std::string name); //Error   C2182   'mymethod': illegal use of type 'void'

~SqurrelClass();

private:
Sqrat::Class<T>* myClass;
};

template<class T>
inline SqurrelClass<T>::SqurrelClass(std::string classname, HSQUIRRELVM v)
{
myClass = new Sqrat::Class<T>(v, classname.c_str());
Sqrat::RootTable(v).Bind(classname.c_str(), *myClass);
}

template<class T>
inline SqurrelClass<T>::~SqurrelClass()
{
delete myClass;
}

Теперь я видел: c ++ передача метода класса в качестве аргумента методу класса с шаблонами

И это СУПЕР близко, но это было решено путем добавления экземпляра класса к вызову метода, что позволило напрямую разыменовать метод класса.

Но я не могу точно сделать это … Никогда не делается экземпляр, к которому у меня есть доступ.

Так как же мне поступить так?

0

Решение

Я тупой.

Забыл добавить () в конец аргумента;

Метод должен быть:

void bindFunction(void (T::*mymethod)(), std::string name);

затем дополнительно для переменных его:

template<typename J>
void bindVariable(J T::*myvar, std::string variable);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]