2009-09-08 4 views
0

Возможно ли получить доступ к аргументам, содержащимся в типе boost :: function?Доступ boost :: аргументы функции

Я хотел бы получить адрес вызываемой функции и значения аргументов, предоставляемых для этой функции.

+0

Я думаю, вы можете смутить «значения аргументов». Он не сохраняет значения аргументов. Когда вы вызываете 'operator'' operator() ', он просто перенаправляет вызов сохраненной функции и передает все предоставленные вами аргументы. Он не хранит никаких копий для себя. Вы можете запрашивать * типы * аргументов, но не значения. Или вы говорите о функции, которую вы связываете с подобными «boost :: bind»? В этом случае 'boost :: function' обертывает некоторый * другой объект-функтор, который, в свою очередь, содержит значения для одного или нескольких связанных аргументов. –

ответ

2

boost :: function стирает тип реализации, но если вы это знаете, вы можете использовать его; поскольку boost :: function сопоставимы по значению (==! =), информация явно доступна.

Похоже (от function_base суперкласса functionN), вы можете получить объект реализации с:

который будет возвращать 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; 

виртуальные таблицы дает вам доступ к:

 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 (functor) полезен только для refs для работы с объектами, связанными (это фиксированные) функции-члены ptrs и свободные функции, где вы не связывали никаких аргументов

Смежные вопросы