gpt4 book ai didi

c++ - 将指针传递给非静态成员函数

转载 作者:行者123 更新时间:2023-11-30 03:34:47 25 4
gpt4 key购买 nike

我有一个类的非静态成员函数:

int Band::overlap(unsigned dim, const double *x, void *data_p, unsigned fdim,
double *retval){

int *data = (int*) data_p;
// data[0] = m; data[1] = n; data[2] = k_ind; data[3] = b
cmplx result = (this->U(x[0], x[1], x[2], data[2], data[0])).adjoint()
* this->U(x[0], x[1], x[2], data[2] + data[3], data[1]);
retval[0] = result.real();
retval[1] = result.imag();
return 0;
}

我想把它传递给cubature ,这要求它具有以下形式:

int f(unsigned ndim, const double *x, void *fdata, unsigned fdim, double *fval)

我考虑过使用 std::mem_fn ,但如果我使用:

auto bla = std::mem_fn(&Band::overlap);

我的电话是:

bla(band_obj, ....)

哪个立方体不接受。然后我考虑使用 lambda,但我读到我只能转换非捕获 lambda,因此我无法捕获 band_obj。

我意识到,有人问过这个问题的变体,我试过了,但似乎没有一个有效。

最佳答案

问题

我们希望 f 成为指向非静态成员函数的指针 并且 被作为常规函数调用——没有 this 指针. std::functionlambda 和所有这些解决方案都行不通 - 我们仍然需要以某种方式传递它们的 this

解决方案

Cubature 提供了 fdata 参数来传递给你的函数,我们可以用它来传递 this 指针:

int f(unsigned ndim, const double *x, void *fdata, unsigned fdim, double *fval) {
Band *band = static_cast<Band*>(fdata);
return band->overlap(ndim, x, fdim, fval);
}

然后调用hcubature,将this参数作为fdata:

hcubature(1, f, static_cast<void*>(band), 
3, xmin, xmax, 0, 0, 1e-4, ERROR_INDIVIDUAL, &val, &err);

关于c++ - 将指针传递给非静态成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41796337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com