2017-08-11 39 views
0

我試圖制定一個包裝我的松鼠VM和SQRat結合C++ sqrat雖然包裝裝訂方法

結合類的通常方法是調用:

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

凡類IM試圖綁定看起來就像這樣:

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; 
} 

現在IV看出:c++ passing class method as argument to a class method with templates

這是SUPER接近,但它是通過添加類的實例的方法調用,允許類的方法,直接去refrenceing解決。

但我完全不能這樣做...一個實例永遠不會被我有權限訪問。

那麼我該如何去做這樣的事情呢?

回答

0

我很笨。

忘記將()添加到參數的末尾;

方法必須是:

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

然後另外變量的:

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

現在,如果我只能找出如何傳遞參數。 –