class gfx {
void resize(int x, int y);
}
gfx g;
g.resize を 'void (*)(int, int)' にキャストできますか?
class gfx {
void resize(int x, int y);
}
gfx g;
g.resize を 'void (*)(int, int)' にキャストできますか?
号gfx::resize
はタイプvoid(gfx::*)(int, int)
です。void(*)(int, int)
typeのオブジェクトのメンバー関数としてのみ呼び出すことができるため、意味のある型に変換することはできません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)
があり、非メンバー関数として呼び出すことができます。このアプローチの一般化された形式は、C++0x にあるstd::function
and機能です ( Boostと C++ TR1 にもあります)。std::bind
はい、できます:
void easy_resize(int x, int y) { g.resize(x, y); }