C++指向UNKNOWN CLASS的成员函数的指针

Kol*_*nya 2 c++ pointers function-pointers class iunknown

免责声明我不使用BOOST或其他图书馆

最后我了解了PointerToMemberFunction的工作原理.这是我的示例代码.

#include <iostream>

using namespace std;

class Foo
{
        public:
                void foo ( )
                {
                        cout << "I'm a foo method\n";
                };
};

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;
}
Run Code Online (Sandbox Code Playgroud)

现在,问题是什么.Bar::bar必须以某种方式修改,因为在实际项目中它不会知道,什么类fooFnPtr是指针.换句话说,Bar::bar必须与任何班级合作,而不仅仅是Foo.我不会知道,指向传递给哪个类的实例的指针Bar::bar.

可以帮助的一件事是,所有可以使用的课程Bar::bar都是一堂课的孩子!

这是可以实现的吗?我如何修复我的代码?提前致谢!

Hen*_*rik 9

你可以做bar一个模板功能:

template<class T>
void bar ( T* fooPtr , void(T::*fooFnPtr)() )
{
    (fooPtr->*fooFnPtr)();
}
Run Code Online (Sandbox Code Playgroud)

当然,如果您只想将指针传递给公共基类中存在的成员,您可以这样做:

#include <iostream>

using namespace std;

class Foo
{
        public:
                virtual void foo ( )
                {
                        cout << "I'm a foo method\n";
                };
};

class Derived: public Foo
{
        public:
                virtual void foo ( )
                {
                        cout << "I'm a Derived method\n";
                };
};


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;
}
Run Code Online (Sandbox Code Playgroud)