Я не думаю, что это можно сделать напрямую, потому что bind
создает новый объект, который принимает объект функции и аргументы по ссылке, и вы не можете перепривязать ссылки.
Однако вы можете легко написать свою собственную шаблонную оболочку функтора с переназначаемым указателем на функцию:
template <typename R, typename A, typename B>
struct ReAssFunctor
{
typedef R(*FP)(A, B);
ReAssFunctor(const A & a_, const B & b_) a(a_), b(b_) { }
R operator()() const { return func(a, b); }
FP function;
private:
const A & a;
const B & b;
};
[Редактировать:] Проверьте комментарии ниже; хранение ссылок, взятых с помощью const-ссылки в конструкторе, может быть опасным, поэтому будьте осторожны или сохраните a
и b
по значению, если хотите. [/]
Теперь вы можете инициализировать функтор с ранними аргументами:
ReAssFunctor<R, A, B> raf(a, b);
Затем назначьте указатель на функцию и вызовите:
raf.function = foo;
raf();
raf.function = goo;
raf();
Вы даже можете заменить оператор вызова на это:
template <typename U>
U operator()(U (f*)(A, B)) const { return f(a, b); }
А затем вызвать функтор с указателем функции в качестве аргумента:
raf(fp1); // calls fp1(a,b);
raf(fp2); // calls fp2(a,b);
В этом случае вам больше не нужен возвращаемый тип в качестве фиксированного параметра, но теперь вы не получаете нулевой оператор вызова. Выбирай.