Передача указателя на функцию-член в качестве аргумента шаблона. Почему это работает?

У меня есть некоторый код, который на 100% работает в моем случае. Мне просто интересно, если кто-нибудь может объяснить, как и почему это работает.

У меня есть шаблонный класс, который находится между некоторым кодом, который обрабатывает потоки и сетевое взаимодействие, и пользователем библиотеки, чтобы передавать данные, полученные с сервера, пользователю.

template <class Bar,
          class Baz,
          class BazReturnType,
          void (Bar::*BarSetterFunction)(const BazReturnType &),
          BazReturnType (Baz::*BazGetterFunction)(void) const>
class Foo
{
    Foo( Bar *bar )
        : m_bar(bar)
    {
    }

    void FooMemberFunction( const Baz *baz )
    {
        boost::bind( BarSetterFunction, m_bar,
                     boost::bind( BazGetterFunction, baz )() ) ();
    }

    Bar *m_bar;
};

Этот шаблон создается и используется в библиотеке в зависимости от типов Bar и Baz, например:

typedef Foo<MyBar,
            MyBaz,
            ReturnTypeFromBazGetterFunction,
            &MyBar::ActualSetterFunction,
            &MyBaz::ActualGetterFunction >
    MyFoo;

MyBar *bar = new MyBar;
MyBaz *baz = new MyBaz;
MyFoo *f = new MyFoo( bar );
f->FooMemberFunction( baz );

Все это работает, и boost :: bind вызывает функции getter / setter для передачи данных туда, куда они должны идти.Как и почему работает передача указателей на функции-члены в качестве аргумента шаблона, как в этом случае?

В ответ на комментарии я не понял, что указатели на функции-члены являются допустимыми аргументами шаблона. Это не то, что я видел "в дикой природе" раньше. Я попробовал это, и это сработало, но я этого не ожидал.

Ответы на вопрос(2)

Ваш ответ на вопрос