Скажем, у меня есть функция foo
:Как передать функцию-член в качестве параметра функции, которая этого не ожидает?
void foo(void (*ftn)(int x))
{
ftn(5);
}
Она нуждается в качестве параметра void
функцию, которая принимает Int в качестве параметра. Рассмотрим
void func1(int x) {}
class X {
public:
void func2(int x) {}
};
Теперь foo(&func1)
нормально.
Но foo(&X::func2)
не нормально, потому что X::func2
не статична и нуждается в объекте контекста и его указатель функции типа отличается.
Я пробовал foo(std::bind(&X:func2, this))
изнутри X
, но это также вызывает несоответствие типа.
Каков правильный способ сделать это?
Рассмотрите возможность изменения функции, чтобы принять 'std :: function' в качестве аргумента. Таким образом, вы можете использовать 'std :: bind' для прозрачного использования либо свободной функции, либо статической функции-члена, либо нестатической функции-члена. –
Функция шаблона foo, скорее всего, самое простое решение. Изменить: Да, как упоминалось выше, еще проще может быть std :: function – Creris
Что делать, если мне не разрешено изменять 'foo' (часть библиотеки)? – batman