Нет, boost :: function вам тоже не поможет. 13.4.3 говорит
Нестатические функции-члены соответствуют целям типа
«Указатель на член-функцию»; тип функции указателя на
член используется для выбора функции-члена из набора
перегруженные функции-члены.
Это означает, что вы не можете взять адрес перегруженной функции-члена, передать его какому-либо объекту функции (шаблонному или нет, boost или std или как угодно) и надеяться, что перегрузка разрешится сама собой. Вам нужен подлинный честный тип указатель на функцию-член в левой части назначения.
Вам придется каким-то образом преобразовать FunctionSignature
в тип указателя на функцию-член. Вот некоторые старомодные шаблоны магии, которые делают то, что вам нужно, для ограниченного числа аргументов функции. C ++ 0x может иметь лучшее, более общее решение.
template <typename C, typename F>
struct tomemfun;
template <typename C, typename res>
struct tomemfun<C, res()>
{
typedef res (C::*memfun_t)();
};
template <typename C, typename res, typename arg1>
struct tomemfun<C, res(arg1)>
{
typedef res (C::*memfun_t)(arg1);
};
template <typename C, typename res, typename arg1, typename arg2>
struct tomemfun<C, res(arg1, arg2)>
{
typedef res (C::*memfun_t)(arg1, arg2);
};
// repeat with more arguments as needed
Теперь вы можете использовать
tomemfun<DerivedClass, FunctionSignature>::memfun_t update = &DerivedClass::update;
и он разрешит перегрузку вправо.
boost
может уже иметь такой шаблон преобразования, но я не смог его найти.