c++ - "Automatically"为 C++ 成员函数创建非成员包装器

标签 c++ wrapper

我有一个包含一堆成员函数的类,这些成员函数执行一些数学运算并返回结果。例如:

class Foo {
public:
  double f(double);
  double g(double);
  double h(double);
  // ...
}

double Foo::f(double foo1) {
  // ...
}
// and so on

在我正在处理的程序中的几个点上,我需要对其中一些函数进行数值积分。我想使用的数值积分例程具有签名

extern "C" double qgauss(double (*func)(double, void*), void* data,
                         double a, double b);

根据我的阅读,将成员函数传递给集成例程的最佳方法似乎是创建包装函数:

double f_wrapper(double x, void* data) {
    return ((Foo*)data)->f(x);
}

但是有大约十几个成员函数 f, g, h 等要包装,也许以后会添加更多,这变得非常重复。我可以(或者应该)使用模板或宏或其他东西来压缩我为创建这些包装函数而必须编写的代码量吗?


顺便说一句,我目前使用的解决方案是将集成例程重新实现为直接接受对象参数的 C++ 函数模板:

template <class C> double qgauss(C* obj, double (C::*func)(double),
                                 double a, double b) {
  // ...
}

但这涉及到大规模的代码重复,我不喜欢这样。如果有人有比创建包装函数或实现集成器的 C++ 版本更好的解决方案,我很想听听,我可以问一个单独的问题是否更合适。

最佳答案

你可以用模板试试:

template <class C, C::*Func>
double wrapper(double x, void* data) {
    return ((C*)data)->*Func(x);
}

qgauss(&wrapper<C, &C::f>, data, a, b);

现在,我还没有试过这个,可能会有一些问题,因为你想要一个函数的地址,它是一个模板——更糟糕的是,我认为你在技术上需要一个 extern "C"功能。如果以上确实是一个死胡同,我认为你应该只使用宏,因为毕竟这是你正在做的 C 编程,而宏是很自然的。

关于c++ - "Automatically"为 C++ 成员函数创建非成员包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7761785/

相关文章:

c++ - C++中如何存储静态数据和方法细节

c++ - 如何链接多个运算符[]

java - JNA 如何包装用 C++ 编写的接口(interface)

python - 如何在 Python 中创建漂亮的 shell 命令包装器

类对象指针的 C++ vector

c++ - 这个数组交集的实现是如何工作的?

c++ - 对列表顶部的人最有可能说出的积极词汇和列表末尾的人很少说的积极词汇进行排序

c++ - 为提供不同接口(interface)的容器包装容器

python - scikit-learn 中回归交叉验证的递归特征消除

c++ - 有没有办法将所有赋值运算符(+=、*= 等)转发为隐式使用重写的直接赋值运算符 (=)?