在c++中让静态成员函数调用非静态成员std::function的正确方法是什么?
What's the correct way to let the static member function call a non-static member std::function in c++?
我正在使用一个 open62541 库,它的功能几乎都是静态的。我必须在open62541的函数中写一些回调函数,回调函数绑定到一些非静态函数。
所以问题是我如何制作:
classA的静态函数调用astd::function,绑定到classB的非静态函数?
为了让问题更简单我举个例子:
#include <iostream>
#include <functional>
using namespace std;
namespace C {
std::function<void(void)>C_foo;
}
class B
{
public:
B()
{
C::C_foo=std::bind(&B::middleMan,this);
}
std::function<void(void)>B_foo;
void middleMan()
{
B_foo();
}
static void talkTheJoke()
{
C::C_foo();
}
};
class A
{
public:
void Knock_knock()
{
std::cout<<"who's there?"<<std::endl;
}
};
int main()
{
A m_A;
B m_B;
// response "who's there?"
m_A.Knock_knock();
m_B.B_foo=std::bind(&A::Knock_knock,m_A);
//response "who's there?" again "
B::talkTheJoke();
return 0;
}
有classA和他们的非静态成员函数A::Knock_knock(),我希望classB的静态成员函数能回调也一样答:Knock_knock().
我在那里放了一个 B_foo 作为回调函数,它将绑定 A:: Knock_knock()。由于 B::talkTheJoke() 是静态的而 B_foo 不是,因此 B::talkTheJoke() 似乎无法调用 B_foo.
所以我放了一个命名空间C作为中间人,C中的std::函数可以被静态函数调用B::talkTheJoke(),也可以绑定到非静态std::函数B::middleMan() 可以调用 B_foo.
故事应该是这样的:
B::talkTheJoke() ----> m_B.B_foo --(std::bind)--> m_A.Knock_knock() (X,无效)
B::talkTheJoke() ----> C::C_foo() --(std::bind)--> m_B.middleman() ----> m_B.B_foo --(std::bind)--> m_A.Knock_knock() ( O ,works )
不过,这个方案真的很丑,
这样做的正确方法是什么?
#include <iostream>
using namespace std;
class A
{
public:
void Knock_knock() {
std::cout<<"who's there?"<<std::endl;
}
};
class B
{
public:
static void setA( A *a ) {
m_A = a;
}
static void talkTheJoke() {
if ( m_A != nullptr )
m_A->Knock_knock();
}
private:
static A *m_A;
};
A* B::m_A = nullptr;
int main()
{
A m_A;
m_A.Knock_knock();
B::setA( &m_A );
B::talkTheJoke();
return 0;
}
我正在使用一个 open62541 库,它的功能几乎都是静态的。我必须在open62541的函数中写一些回调函数,回调函数绑定到一些非静态函数。
所以问题是我如何制作:
classA的静态函数调用astd::function,绑定到classB的非静态函数?
为了让问题更简单我举个例子:
#include <iostream>
#include <functional>
using namespace std;
namespace C {
std::function<void(void)>C_foo;
}
class B
{
public:
B()
{
C::C_foo=std::bind(&B::middleMan,this);
}
std::function<void(void)>B_foo;
void middleMan()
{
B_foo();
}
static void talkTheJoke()
{
C::C_foo();
}
};
class A
{
public:
void Knock_knock()
{
std::cout<<"who's there?"<<std::endl;
}
};
int main()
{
A m_A;
B m_B;
// response "who's there?"
m_A.Knock_knock();
m_B.B_foo=std::bind(&A::Knock_knock,m_A);
//response "who's there?" again "
B::talkTheJoke();
return 0;
}
有classA和他们的非静态成员函数A::Knock_knock(),我希望classB的静态成员函数能回调也一样答:Knock_knock().
我在那里放了一个 B_foo 作为回调函数,它将绑定 A:: Knock_knock()。由于 B::talkTheJoke() 是静态的而 B_foo 不是,因此 B::talkTheJoke() 似乎无法调用 B_foo.
所以我放了一个命名空间C作为中间人,C中的std::函数可以被静态函数调用B::talkTheJoke(),也可以绑定到非静态std::函数B::middleMan() 可以调用 B_foo.
故事应该是这样的:
B::talkTheJoke() ----> m_B.B_foo --(std::bind)--> m_A.Knock_knock() (X,无效)
B::talkTheJoke() ----> C::C_foo() --(std::bind)--> m_B.middleman() ----> m_B.B_foo --(std::bind)--> m_A.Knock_knock() ( O ,works )
不过,这个方案真的很丑,
这样做的正确方法是什么?
#include <iostream>
using namespace std;
class A
{
public:
void Knock_knock() {
std::cout<<"who's there?"<<std::endl;
}
};
class B
{
public:
static void setA( A *a ) {
m_A = a;
}
static void talkTheJoke() {
if ( m_A != nullptr )
m_A->Knock_knock();
}
private:
static A *m_A;
};
A* B::m_A = nullptr;
int main()
{
A m_A;
m_A.Knock_knock();
B::setA( &m_A );
B::talkTheJoke();
return 0;
}