c ++ sqrat 通过包装器绑定方法
c++ sqrat binding methods though a wrapper
我正在尝试为我的 Squirrel VM 和 SQRat 绑定开发一个包装器
绑定class的正常方法是调用:
Class<MyClass> myClass(vm,"myClass");
myClass.Func(_SC("Foo"), &MyClass::Foo);
我尝试绑定的 class 看起来像这样:
class MyClass {
public:
void Foo() { cout << bar; }
int bar;
};
现在 iv 将 squirrel 包装成一个助手 class 来处理机器状态和名为 "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);
}
在main中调用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++ passing class method as argument to a class method with templates
这是非常接近的,但是通过在方法调用中添加 class 的实例解决了这个问题,允许直接取消引用 class 的方法。
但我不能完全做到...从来没有制作过我有权访问的实例。
那么我该怎么做呢?
我很笨
忘记在参数末尾添加 ();
方法需要是:
void bindFunction(void (T::*mymethod)(), std::string name);
然后另外为变量它:
template<typename J>
void bindVariable(J T::*myvar, std::string variable);
我正在尝试为我的 Squirrel VM 和 SQRat 绑定开发一个包装器
绑定class的正常方法是调用:
Class<MyClass> myClass(vm,"myClass");
myClass.Func(_SC("Foo"), &MyClass::Foo);
我尝试绑定的 class 看起来像这样:
class MyClass {
public:
void Foo() { cout << bar; }
int bar;
};
现在 iv 将 squirrel 包装成一个助手 class 来处理机器状态和名为 "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);
}
在main中调用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++ passing class method as argument to a class method with templates
这是非常接近的,但是通过在方法调用中添加 class 的实例解决了这个问题,允许直接取消引用 class 的方法。
但我不能完全做到...从来没有制作过我有权访问的实例。
那么我该怎么做呢?
我很笨
忘记在参数末尾添加 ();
方法需要是:
void bindFunction(void (T::*mymethod)(), std::string name);
然后另外为变量它:
template<typename J>
void bindVariable(J T::*myvar, std::string variable);