免责声明我不使用BOOST
或其他库
最后,我了解了PointerToMemberFunction的工作原理。这是我的示例代码。
#include <iostream>
using namespace std;
class Foo
{
public:
void foo ( )
{
cout << "I'm a foo methodn";
};
};
class Bar
{
public:
void bar ( Foo* fooPtr , void(Foo::*fooFnPtr)() )
{
(fooPtr->*fooFnPtr)();
};
};
int main()
{
Foo* foo = new Foo();
Bar* bar = new Bar();
bar->bar ( foo , &Foo::foo );
return 0;
}
现在,问题是什么。必须以某种方式修改Bar::bar
,因为在实际项目中,它不知道fooFnPtr
是指向的指针。换句话说,Bar::bar
必须与任何类一起工作,而不仅仅是与Foo
一起工作。我不知道,一个指向什么类的实例的指针被传递给Bar::bar
。
有一件事可以帮助的是,所有将使用Bar::bar
的类都是一个类的子类!
这是可以实现的吗?如何实现?如何修复我的代码?提前感谢!
您可以将bar
作为模板函数:
template<class T>
void bar ( T* fooPtr , void(T::*fooFnPtr)() )
{
(fooPtr->*fooFnPtr)();
}
当然,如果您只想将指针传递给公共基类中存在的成员,您可以简单地执行以下操作:
#include <iostream>
using namespace std;
class Foo
{
public:
virtual void foo ( )
{
cout << "I'm a foo methodn";
};
};
class Derived: public Foo
{
public:
virtual void foo ( )
{
cout << "I'm a Derived methodn";
};
};
class Bar
{
public:
void bar ( Foo* fooPtr , void(Foo::*fooFnPtr)() )
{
(fooPtr->*fooFnPtr)();
}
};
int main()
{
Derived* derived = new Derived();
Bar* bar = new Bar();
bar->bar ( derived , &Foo::foo );
return 0;
}
我想你在寻找闭包和委托,或者C++中的等价物。简而言之,它们是可以调用的实例,同时包含指向类实例(或实例本身)的指针和指向其中方法的指针。
看看std::bind。它们通常返回模板类的神秘实例,这些实例都可以转换为std::function<…>,以防您需要使用统一类型的参数作为函数或方法的参数。
所以,你的代码应该是这样的:
void Bar::bar(std::function<void()> f)
{
....
}
Foo* foo = new Foo();
Bar* bar = new Bar();
auto f = std::bind( &Foo::foo, foo);
bar->bar ( f );
当然,如果你决定不使用任何库,你可以看看这些库以前是如何解决这个问题的,这样你就可以以最好的方式重新发明轮子。