Нет. gfx::resize
имеет тип void(gfx::*)(int, int)
. Вы не можете осмысленно преобразовать его в тип void(*)(int, int)
, потому что вы можете вызывать его только как функцию-член для объекта типа gfx
.
Функция-член может быть вызвана только для экземпляра класса, поэтому, учитывая ваш gfx g;
, вы можете вызвать g.resize()
, но вы не можете просто вызвать resize()
, как если бы это была обычная функция. Обычный указатель на функцию не может указывать на функцию-член, потому что у него нет никакого способа привязать вызов функции к экземпляру класса.
Концептуально, функция-член принимает дополнительный параметр, параметр this
, который указывает на экземпляр класса, для которого она была вызвана.
Если вы хотите иметь возможность вызывать функцию-член с помощью обычного указателя на функцию, вы можете создать оболочку функции, не являющейся членом (или статической функции-члена), с параметром, которому вы можете передать экземпляр объекта, для которого вызовите функцию-член. Например, вы могли бы иметь:
void resize(gfx* obj, int x, int y) {
return obj->resize(x, y);
}
Эта функция без элемента resize
имеет тип void(*)(gfx*, int, int)
и может вызываться как функция без элемента. Обобщенной формой этого подхода являются std::function
и std::bind
средства, найденные в C ++ 0x (вы также можете найти их в Boost и в C ++ TR1).