c++ - 在函数指针返回值中转换对指针的引用

标签 c++ c++11 function-pointers emscripten

Emscripten 为从 JavaScript 调用 C++ 函数生成自动绑定(bind)。但是,如果函数返回一个引用,结果将按值传递给 JavaScript。指针返回值通过引用传递。所以如果我有一个函数:

MyType &MyClass::doStuff(int x,int y);

我可以这样做:

function("doStuff",&MyClass::doStuff);

使其出现在 JavaScript 中。但我需要的是:

function("doStuff",reinterpret_cast<MyType *(MyClass::*)(int,int)>(&doStuff));

让它返回一个指针。然而,为每个函数键入内容很糟糕,所以我需要一个神奇的宏来转换:

function("doStuff",MAGIC(MyClass::doStuff));

通过强制转换或类似的东西进入上面的版本(对于接受任意数量任意类型参数的函数)。问题是:这在 C++11 中可能吗?

最佳答案

对函数指针(或成员函数指针)执行reinterpret_cast 是一个非常糟糕的主意。

相反,编写一个适配器:

template<typename M, M m> struct make_wrapper_helper;
template<typename T, typename R, typename... A, R& (T::*m)(A...)>
struct make_wrapper_helper<R& (T::*)(A...), m> {
  R* (*operator()())(T&, A...) {
    return [](T& t, A ...a) -> R* { return &(t.*m)(static_cast<A>(a)...); };
  }
};
template<typename M, M m>
decltype(make_wrapper_helper<M, m>()()) make_wrapper() {
  return make_wrapper_helper<M, m>()();
}

function("doStuff", make_wrapper<decltype(&MyClass::doStuff), &MyClass::doStuff>())

不幸的是,因为 lambda 必须是无捕获的,所以成员函数指针必须作为非类型模板参数传递,这意味着它不能被推导。您可以使用宏来解决此问题。

关于c++ - 在函数指针返回值中转换对指针的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24940136/

相关文章:

c++ - Makefile 循环依赖被丢弃

C++11:lambda malloc 每次声明时都会占用空间吗?

c - 关于函数指针声明

c++ - 指向类成员函数的指针类型转换错误

c++ - 在 C++ 中对类属性使用字符串数据类型的问题

c++ - std::async - 参数 vector 已损坏

c++ - 当 constexpr 函数出错时会发生什么?

C++:如何将类方法定义为线程的启动例程(使用 pthread 库)

c++ - cpp 中有关 .idl 文件的信息

c++ - 返回对此的引用时出现意外的 std::ostream 输出