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