指向未知类的成员函数的C++指针



免责声明我不使用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 );

当然,如果你决定不使用任何库,你可以看看这些库以前是如何解决这个问题的,这样你就可以以最好的方式重新发明轮子。

相关内容

  • 没有找到相关文章

最新更新