Если вы можете использовать boost, тогда вы можете сделать более чистый подход, используя boost :: function и boost :: bind, чтобы получить нужные вам указатели.
template <typename BC>
class RBase : public BC
{
public:
typedef int FunctionSignature (void) const;
typedef boost::function<FunctionSignature> CallbackFunction;
protected:
std::map<const char*, CallbackFunction> mGetFPs;
};
class CBase
{
};
class RC1 : public RBase<CBase>
{
public:
RC1 ()
{
mGetFPs.insert ( std::make_pair ( "RC1I1I",
boost::bind ( &RC1::int1, this ) ) );
}
int int1(void) const { return 1; }
};
class RC2 : public RC1
{
public:
RC2 ()
{
mGetFPs.insert ( std::make_pair ( "RC2I2I",
boost::bind ( &RC2::int2, this ) ) );
}
int int2(void) const { return 2; }
};
Фактически, вы можете назначить ЛЮБУЮ функцию, которая имеет правильную сигнатуру, для boost :: function и даже использовать boost :: bind для адаптации функций, имеющих дополнительные параметры (см. Ниже).
class RC3 : public RC1
{
public:
RC3 ()
{
mGetFPs.insert ( std::make_pair ( "RC3I3I",
boost::bind ( &RC3::intN, this, 3 ) ) );
}
int intN(int n) const { return n; }
};