【问题标题】:c++ sqrat binding methods though a wrapperc++ sqrat 绑定方法虽然是一个包装器
【发布时间】:2018-01-20 09:11:25
【问题描述】:

我正在尝试为我的 Squirrel VM 和 SQRat 绑定开发一个包装器

绑定类的正常方式是调用:

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

我试图绑定的类如下所示:

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

现在 iv 将 squirrel 包装成一个辅助类,用于处理机器状态和错误,称为“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;
}

我只是无法完全理解 bind 方法的实现。

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

这非常接近,但通过将类的实例添加到方法调用中解决了这个问题,允许直接取消对类方法的引用。

但我不能完全做到这一点...永远不会创建我可以访问的实例。

那么我该如何去做这样的事情呢?

【问题讨论】:

    标签: c++ squirrel


    【解决方案1】:

    我很笨。

    忘记在参数末尾添加 ();

    方法需要是:

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

    然后另外为变量其:

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

    【讨论】:

    • 现在如果我能弄清楚如何传递参数。
    猜你喜欢
    • 2014-10-30
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多