我有一个库,该库公开了仅允许使用双精度数组和回调函数的C ++ API。回调函数接受double数组。例如
FAIL src/test/Mail.spec.js
● without store › submit click event
expect(jest.fn()).toHaveBeenCalledTimes(1)
Expected mock function to have been called one time, but it was called zero times.
at Object.test (src/test/Mail.spec.js:61:21)
at new Promise (<anonymous>)
at Promise.resolve.then.el (node_modules/p-map/index.js:46:16)
at <anonymous>
但是,对于我的用例,我的数据最好存储在一个自定义类中,并且我想将该类的实例传递给C ++ API,以便回调函数可以在该类实例上运行。有什么方法可以将C ++类实例转换为双精度数组,然后再将其转换回回调函数中?
答案 0 :(得分:1)
也许创建一个可转换为const double*
并可以从const double*
构造的类是更好的解决方案,因此您可以将实例传递给api,让编译器隐式地进行转换并在其中构造该类FUN
回调。我不确定它是否适合您的需求,但我还是分享。
#include <iostream>
#include <vector>
using namespace std;
typedef double(*FUN)(const double *);
double api(const double *arr, FUN cb){
return cb( arr );
}
class your_class
{
public:
operator const double*() { return m_data.data(); }
your_class() = default;
your_class( const double* data ) {
// You should somehow know size of the data
// So you can fill 'm_data' vector with 'data'
}
double do_calculations() {
double result {};
// do calculations
return result;
}
private:
std::vector<double> m_data;
};
double fn( const double* data )
{
your_class instance { data };
return instance.do_calculations();
}
int main()
{
your_class instance;
auto result = api( instance , &fn );
return 0;
}
答案 1 :(得分:0)
您要的是void*
。这样您就失去了所有类型安全性。最好声明一种作用于您的类的api而不是双精度数组。
您可能还应该听听@BasinhetVeld所说的话。使用适当的容器类保存数据。
答案 2 :(得分:0)
是否可以将C ++类实例转换为双精度数组
不。但是您可以将类转换为双指针,这是API期望的。
然后将其转换回回调函数中?
这有点棘手。如果双指针指向类的特定成员的n个元素,并且该类是标准布局类,则可以使用container_of或类似的宏来计算超级对象的地址从成员的偏移量中获取正确类型的指针。
如果不满足这些要求,即,如果该类不是标准布局,或者如果double数组不是成员,则无法直接找出所有者类。在这种情况下,您可以通过将双指针与关联对象的指针相关联来解决该限制,并全局存储该映射。这不是很漂亮。