Как получить указатель C (например, `var (*) (void *, var)`) из `boost :: function & lt; var (void *, var) & gt;`?

Возможный дубликат:
понизить boost :: function для простого указателя на функцию

Поэтому я использую Компилятор Flash C ++ (он же флэшк, алхимия) и хавин код, как:

boost::function<var (void*, var)> f = boost::bind(&as3_socket::socket_socketData, this, _1, _2);
socket->addEventListener(flash::events::ProgressEvent::SOCKET_DATA, Function::_new(f, NULL));

получить следующую ошибку компилятора:

$ g++ $JN -static -emit-llvm  -c src/utils/http/as3_socket.cpp -I../boost/boost_libraries/install-dir/include
src/utils/http/as3_socket.cpp: In constructor ‘as3_socket::as3_socket()’:
src/utils/http/as3_socket.cpp:75: error: no matching function for call to ‘AS3::ui::Function::_new(boost::function<AS3::ui::var ()(void*, AS3::ui::var)>*, NULL)’
/cygdrive/c/Users/Avesta/Downloads/FlasCC_1.0.1134176_11-09-2012/sdk/usr/bin/../../usr/include/AS3++/builtin.h:179: note: candidates are: static AS3::ui::Function AS3::ui::Function::_new()
/cygdrive/c/Users/Avesta/Downloads/FlasCC_1.0.1134176_11-09-2012/sdk/usr/bin/../../usr/include/AS3++/builtin.h:180: note:                 static AS3::ui::Function AS3::ui::Function::_new(AS3::ui::var (*)(void*, AS3::ui::var), void*)

Так что вопрос в том, как получить от boost::function<var (void*, var)> больше стиля C var (*)(void*, var)

1

Решение

Краткий ответ: «Вы не можете».

Объект функции Boost может содержать только указатель на функцию, но это может быть результатом вызова boost::bind () на некоторый другой тип функции и связывание некоторых параметров. Он также может содержать функциональный объект.

То, что вы можете вызывать его как указатель на функцию, не означает, что это указатель на функцию.

[Только что заметил — ссылка на другой вопрос выше объясняет это очень подробно]
1

Другие решения

Вы задаете неправильный вопрос.

boost::function это способ выразить «сделай что-нибудь в будущем», но это не указатель на функцию C ++. Я слишком силен, чтобы соответствовать указателю на функцию.

Однако ваш интерфейс обратного вызова — это функция C ++, которая принимает пустой указатель и что-то еще. Обычно вы предоставляете обратный вызов как с указателем void, так и с указателем функции.

Итак, вы создаете функцию, которая приводит указатель void к объекту, а затем передает этому объекту остальные аргументы, с которыми он был вызван.

Убедитесь, что тип, который вы разыгрываете как void и back, идентичен.

Вы могли бы даже повернуть указатель на boost::function в пустоту

Обратите внимание, что это оставляет вам проблему управления временем жизни товара, на который указывает объект. Отстой, не так ли?

0