将 public 但非静态成员函数与 ALGLIB 集成
Integrate a public but non static member function with ALGLIB
我正在尝试集成 class 的成员函数,需要一些帮助!我不能将函数声明为静态的,因为此函数使用非静态私有成员(更具体地说,使用另一个 class 的私有成员)。 我正在使用 C++17,无法降级
我在下面写了一个模拟我的问题的最小(非)工作示例。目的是找到代替四个问号 '????' 的内容。在 alglib::autogkintegrate(s, ????, params)
.
alglib::autogkintegrate
函数接受三个参数:
- a 'state' 其中包含积分的当前值、积分边界和其他内容?)
- 要集成的函数
f
必须原型void f(double x, double xminusa, double bminusx, double &y, void *ptr)
- 一个可选指针
void *ptr
,它包含函数 f
的额外参数
这是无效的例子:
#include <functional>
#include <iostream>
#include <cmath>
#include "integration.h"
class Foo;
class Bar;
/*****************************
Class Foo
*****************************/
class Foo
{
public:
// Constructor
Foo(Bar *b, int toto);
// Function to integrate
void f(double x, double xminusa, double bminusx, double &y, void *ptr);
private:
Bar *m_bar;
int m_toto;
};
Foo::Foo(Bar *b, int toto) : m_bar(b), m_toto(toto)
{}
void Foo::f(double x, double xminusa, double bminusx, double &y, void *ptr)
{
double *param = (double *) ptr;
double p1 = param[0];
double p2 = param[1];
y = exp(this->m_toto*x)/(p1 * p2);
}
/*****************************
Class Bar
*****************************/
class Bar
{
friend Foo;
public:
// Constructor
Bar();
private:
int m_a, m_b;
};
Bar::Bar() : m_a(2), m_b(5)
{}
/*****************************
Main program
*****************************/
int main(int argc, char *argv[])
{
Bar* b = new Bar();
Foo f(b, 87);
double arrayParams[2] = {1, 2};
double (*params)[2] = &arrayParams;
alglib::autogkstate s;
double v;
alglib::autogkreport rep;
alglib::autogksmooth(0, 1, s);
alglib::autogkintegrate(s, ????, params);
alglib::autogkresults(s, v, rep);
return 0;
}
如果我将函数 f
声明为静态(并在 f
中删除 this->m_toto
),那么我可以使用 alglib::autogkintegrate(s, Foo::f, params);
集成 f
。所以问题实际上是访问函数 f
.
我试图定义一个指向成员函数的指针(这解释了 #include <functional>
)但未能在 alglib::autogkintegrate(s, ????, params);
中使用它
重复我的问题:我想在 C++ 中使用 ``Alglib``` 集成 class 的成员函数
有用的链接:
- https://www.alglib.net/translator/man/manual.cpp.html#gs_using 第 8.5 节
- https://www.alglib.net/translator/man/manual.cpp.html#example_autogk_d1
P.S.: 我还在 http://forum.alglib.net/viewtopic.php?f=2&t=4352 上 post 编辑了这个问题,这是一个 Alglib 的专用论坛(但看起来比 Stack Overflow 活跃得多,因此我的双 post。如果我在那里得到答案,我会复制粘贴到这里,反之亦然)
我在 http://www.newty.de/fpt/callback.html 上找到了一个使用全局变量的解决方案(抱歉...)。我 post 这里的代码适用于我的问题,如果有人需要的话:
#include <functional>
#include <iostream>
#include <cmath>
#include "integration.h"
class Foo;
class Bar;
void* pt2Object; // global variable which points to an arbitrary object
/*****************************
Class Foo
*****************************/
class Foo
{
public:
// Constructor
Foo(Bar *b, int toto);
// Function to integrate
void f(double x, double xminusa, double bminusx, double &y, void *ptr);
// Wrapper
static void Wrapper_To_Call_f(double x, double xminusa, double bminusx, double &y, void *ptr);
private:
Bar *m_bar;
int m_toto;
};
Foo::Foo(Bar *b, int toto) : m_bar(b), m_toto(toto)
{}
void Foo::f(double x, double xminusa, double bminusx, double &y, void *ptr)
{
double *param = (double *) ptr;
double p1 = param[0];
double p2 = param[1];
y = exp(this->m_toto*x)/(p1 * p2);
// y = exp(x)/(p1 * p2);
}
void Foo::Wrapper_To_Call_f(double x, double xminusa, double bminusx, double &y, void *ptr)
{
// explicitly cast global variable <pt2Object> to a pointer to TClassB
// warning: <pt2Object> MUST point to an appropriate object!
Foo* mySelf = (Foo*) pt2Object;
// call member
mySelf->f(x, xminusa, bminusx, y, ptr);
}
/*****************************
Class Bar
*****************************/
class Bar
{
friend Foo;
public:
// Constructor
Bar();
private:
int m_a, m_b;
};
Bar::Bar() : m_a(2), m_b(5)
{}
/*****************************
Main program
*****************************/
int main(int argc, char *argv[])
{
Bar* b = new Bar();
// Create Foo
Foo myFoo(b, 1);
// Assign global variable which is used in the static wrapper function
// important: never forget to do this!!
pt2Object = (void*) &myFoo;
double arrayParams[2] = {1, 2};
double (*params)[2] = &arrayParams;
alglib::autogkstate s;
double v;
alglib::autogkreport rep;
alglib::autogksmooth(0, 1, s);
alglib::autogkintegrate(s, Foo::Wrapper_To_Call_f, params);
alglib::autogkresults(s, v, rep);
std::cout << v << std::endl;
return 0;
}
我正在尝试集成 class 的成员函数,需要一些帮助!我不能将函数声明为静态的,因为此函数使用非静态私有成员(更具体地说,使用另一个 class 的私有成员)。 我正在使用 C++17,无法降级
我在下面写了一个模拟我的问题的最小(非)工作示例。目的是找到代替四个问号 '????' 的内容。在 alglib::autogkintegrate(s, ????, params)
.
alglib::autogkintegrate
函数接受三个参数:
- a 'state' 其中包含积分的当前值、积分边界和其他内容?)
- 要集成的函数
f
必须原型void f(double x, double xminusa, double bminusx, double &y, void *ptr)
- 一个可选指针
void *ptr
,它包含函数f
的额外参数
这是无效的例子:
#include <functional>
#include <iostream>
#include <cmath>
#include "integration.h"
class Foo;
class Bar;
/*****************************
Class Foo
*****************************/
class Foo
{
public:
// Constructor
Foo(Bar *b, int toto);
// Function to integrate
void f(double x, double xminusa, double bminusx, double &y, void *ptr);
private:
Bar *m_bar;
int m_toto;
};
Foo::Foo(Bar *b, int toto) : m_bar(b), m_toto(toto)
{}
void Foo::f(double x, double xminusa, double bminusx, double &y, void *ptr)
{
double *param = (double *) ptr;
double p1 = param[0];
double p2 = param[1];
y = exp(this->m_toto*x)/(p1 * p2);
}
/*****************************
Class Bar
*****************************/
class Bar
{
friend Foo;
public:
// Constructor
Bar();
private:
int m_a, m_b;
};
Bar::Bar() : m_a(2), m_b(5)
{}
/*****************************
Main program
*****************************/
int main(int argc, char *argv[])
{
Bar* b = new Bar();
Foo f(b, 87);
double arrayParams[2] = {1, 2};
double (*params)[2] = &arrayParams;
alglib::autogkstate s;
double v;
alglib::autogkreport rep;
alglib::autogksmooth(0, 1, s);
alglib::autogkintegrate(s, ????, params);
alglib::autogkresults(s, v, rep);
return 0;
}
如果我将函数 f
声明为静态(并在 f
中删除 this->m_toto
),那么我可以使用 alglib::autogkintegrate(s, Foo::f, params);
集成 f
。所以问题实际上是访问函数 f
.
我试图定义一个指向成员函数的指针(这解释了 #include <functional>
)但未能在 alglib::autogkintegrate(s, ????, params);
重复我的问题:我想在 C++ 中使用 ``Alglib``` 集成 class 的成员函数
有用的链接:
- https://www.alglib.net/translator/man/manual.cpp.html#gs_using 第 8.5 节
- https://www.alglib.net/translator/man/manual.cpp.html#example_autogk_d1
P.S.: 我还在 http://forum.alglib.net/viewtopic.php?f=2&t=4352 上 post 编辑了这个问题,这是一个 Alglib 的专用论坛(但看起来比 Stack Overflow 活跃得多,因此我的双 post。如果我在那里得到答案,我会复制粘贴到这里,反之亦然)
我在 http://www.newty.de/fpt/callback.html 上找到了一个使用全局变量的解决方案(抱歉...)。我 post 这里的代码适用于我的问题,如果有人需要的话:
#include <functional>
#include <iostream>
#include <cmath>
#include "integration.h"
class Foo;
class Bar;
void* pt2Object; // global variable which points to an arbitrary object
/*****************************
Class Foo
*****************************/
class Foo
{
public:
// Constructor
Foo(Bar *b, int toto);
// Function to integrate
void f(double x, double xminusa, double bminusx, double &y, void *ptr);
// Wrapper
static void Wrapper_To_Call_f(double x, double xminusa, double bminusx, double &y, void *ptr);
private:
Bar *m_bar;
int m_toto;
};
Foo::Foo(Bar *b, int toto) : m_bar(b), m_toto(toto)
{}
void Foo::f(double x, double xminusa, double bminusx, double &y, void *ptr)
{
double *param = (double *) ptr;
double p1 = param[0];
double p2 = param[1];
y = exp(this->m_toto*x)/(p1 * p2);
// y = exp(x)/(p1 * p2);
}
void Foo::Wrapper_To_Call_f(double x, double xminusa, double bminusx, double &y, void *ptr)
{
// explicitly cast global variable <pt2Object> to a pointer to TClassB
// warning: <pt2Object> MUST point to an appropriate object!
Foo* mySelf = (Foo*) pt2Object;
// call member
mySelf->f(x, xminusa, bminusx, y, ptr);
}
/*****************************
Class Bar
*****************************/
class Bar
{
friend Foo;
public:
// Constructor
Bar();
private:
int m_a, m_b;
};
Bar::Bar() : m_a(2), m_b(5)
{}
/*****************************
Main program
*****************************/
int main(int argc, char *argv[])
{
Bar* b = new Bar();
// Create Foo
Foo myFoo(b, 1);
// Assign global variable which is used in the static wrapper function
// important: never forget to do this!!
pt2Object = (void*) &myFoo;
double arrayParams[2] = {1, 2};
double (*params)[2] = &arrayParams;
alglib::autogkstate s;
double v;
alglib::autogkreport rep;
alglib::autogksmooth(0, 1, s);
alglib::autogkintegrate(s, Foo::Wrapper_To_Call_f, params);
alglib::autogkresults(s, v, rep);
std::cout << v << std::endl;
return 0;
}