のは、私は次の関数インタフェースを持っているとしましょう:単純に機能生の関数ポインタに近代的なC++ 11機能から変換
void giveme(void (*p)());
なし戻り値の型と引数を持つ関数へのポインタを受け付けます。
クラスメソッドをその関数のパラメータとして渡す方法があるかどうか(変更なしのインターフェイス)
例を使って説明してみましょう。私は機能giveme
のパラメータとして(クラスのアドレス可能なインスタンスの)bar<T>
を渡したい
class Foo {
public:
template<typename T>
void bar();
};
:ように私は、クラスを持っています。
私はバインドオブジェクトとメソッドを考え、関数のターゲットを取得すると思った。
int main(int argc, char *argv[]) {
Foo foo;
std::function<void()> f = std::bind(&Foo::bar<int>, &foo);
giveme(f.target<void()>());
return 0;
}
それはコンパイルが、hereから、ので、明らかに動作しません:typeid(TargetType)==target_type()
よう
TargetType
は、ターゲット・タイプと一致するもののような何か。それ以外の場合は、関数は常にnullポインタを返します。
これが実現する方法は何ですか?
Foo * foo_ptr; // maybe thread_local
void foo_call()
{
foo_ptr->bar<int>();
}
int main()
{
Foo foo;
foo_ptr = &foo;
give_me(&foo_call);
}
それはかなりありませんが、どちらもあなたの状況である:ここでは
この特定の状態を維持する関数を作成するために、何らかのjitなしでこれを行うことはできません。 – krzaq
短い答えは:いいえ、ありません。 –
通常の方法はサンクですが、C++にはそのようなことはありません。 –