0

boost::function 型に含まれる引数にアクセスすることは可能ですか?

呼び出される関数のアドレスと、その関数に提供された引数の値を取得できるようにしたいと考えています。

4

1 に答える 1

2

boost::function は実装タイプを消去しますが、それがわかっている場合はそれにキャストできます。boost::function は値 (== !=) で比較できるため、情報は明確に入手できます。

(functionN の function_base スーパークラスから) 次のように実装オブジェクトを取得できます。

f.target<concrete_functor_type>()

間違った具象型を指定した場合、NULL が返されます。

また、 function_base で(おそらく上記のターゲットメソッド以外では役に立たないでしょう):

public: // should be protected, but GCC 2.95.3 will fail to allow access
  detail::function::vtable_base* vtable;
  mutable detail::function::function_buffer functor;

vtable では、次のものにアクセスできます。

      struct vtable_base
      {
        void (*manager)(const function_buffer& in_buffer, 
                        function_buffer& out_buffer, 
                        functor_manager_operation_type op);
      };

これにより、ファンクターの typeid を取得できます。

  case get_functor_type_tag:
    out_buffer.type.type = &typeid(F);
    out_buffer.type.const_qualified = in_buffer.obj_ref.is_const_qualified;
    out_buffer.type.volatile_qualified = in_buffer.obj_ref.is_volatile_qualified;
    return;
  }

function_buffer (ファンクター) は、関数オブジェクトへの参照、バインドされた (これは修正済み) メンバー関数 ptr、および引数をバインドしていないフリー関数にのみ役立ちます。

于 2009-09-08T17:54:35.250 に答える