首页 > 解决方案 > 无法运行包装器以返回成员函数指针

问题描述

我需要将指向非静态成员函数的指针传递给外部库。成员函数使用特定于对象的变量,所以我不能将它们设为 static。但是,我可以获得this指向当前对象的指针。所以我决定编写一个可以使用this指针返回成员函数指针的包装器。但我无法让 C++ 停止抛出错误。我能得到一些帮助吗?

我已经尝试过 1) 返回&classname::functionname 2) 返回functionname 3) 类型转换为void指针。但这些都不起作用。这就是为什么我决定使用包装器。


// Member function 1 of class MyClass
// that uses object-specific variables
// and hence cannot be made static
template<typename T> vector<T> MyClass<T>::dxBydt(T x, vector<T> y){
    ...
    ...
    return dxdt;
}

// Member function 2 of class MyClass
// that uses object-specific variables
// and hence cannot be made static
template<typename T> vector<T> MyClass<T>::res(Matrix<T> bc){
    ...
    ...
    return r;
}
// ===================

// Wrapper for member function 1
template<typename T> vector<T> (MyClass<T>::*dxBydt_wrapper(void* pointerToObject)) (T, vector<T>) {
    MyClass<T>* thisObject = (MyClass<T>*) pointerToObject;
    return thisObject->*dxBydt;
}

// Wrapper for member function 2
template<typename T> VectorXm<T>  (MyClass<T>::*res_wrapper(void* pointerToObject))(Matrix<T>){
    MyClass<T>* thisObject = (MyClass<T>*) pointerToObject;
    return thisObject->*res;
}

// Where the action happens
template<typename T> Solution<T> MyClass<T>::solve(){
    ...
    ...
    ...

    // odeSolver is external and takes two free function pointers
    // but throws errors with member function pointers
    solution = odeSolver<T>(..., dxBydt_wrapper(this), res_wrapper(this), ...);
    return solution;
}

我收到错误 1.error: 'dxBydt' was not declared in this scope和 2. error: 'res' was not declared in this scope

尽管如此,thisObject应该可以访问上述两个功能。

你能否引导我找到一个解决方案,以便这个包装器成功返回一个函数指针?

标签: c++pointersc++17

解决方案


推荐阅读