【问题标题】:How to get C pointer (like `var (*)(void*, var)`) out of `boost::function<var (void*, var)>`? [duplicate]如何从 `boost::function<var (void*, var)>` 中获取 C 指针(如 `var (*)(void*, var)`)? [复制]
【发布时间】:2012-12-06 03:02:48
【问题描述】:

可能重复:
demote boost::function to a plain function pointer

所以我使用Flash C++ Compiler (aka flascc, alchemy) 并使用如下代码:

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&lt;var (void*, var)&gt;获得更多的C风格var (*)(void*, var)

【问题讨论】:

  • 请有人创建 flascc 标签...
  • 错误来自g++。你通过 flascc 调用它并不重要。您是否想将输出转换为闪存并不重要。这是一个简单的 C++ 问题。

标签: c++ boost boost-function


【解决方案1】:

简短的回答是“你不能”。

boost 函数对象可能只包含一个函数指针,但它可能是在其他函数类型上调用boost::bind () 并绑定一些参数的结果。它还可能包含一个函数对象。

仅仅因为你可以像函数指针一样调用它并不意味着它是函数指针。

[刚刚注意到 - 上面其他问题的链接详细解释了这一点]

【讨论】:

    【解决方案2】:

    你问错问题了。

    boost::function 是一种表达“将来做某事”的方式,但它不是指向 C++ 函数的指针。我太强了,不适合作为函数的指针。

    但是,您的回调接口是一个 C++ 函数,它接受一个 void 指针和其他东西。通常你为回调提供 void 指针和函数指针。

    所以你要做的是创建一个函数,将 void 指针转换为一个对象,然后将该对象传递给它被调用的其余参数。

    确保您转换为 void 和 back 的类型相同。

    您甚至可以将指向 boost::function 的指针转换为 void ptr。

    请注意,这会给您带来管理好指向对象的生命周期的问题。是不是很烂?

    【讨论】:

      猜你喜欢
      • 2014-04-12
      • 1970-01-01
      • 2015-08-23
      • 2021-07-24
      • 2020-03-02
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多