“自动”为C ++成员函数创建非成员包装器

时间:2011-10-13 23:58:43

标签: 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);
}

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


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

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

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

1 个答案:

答案 0 :(得分:2)

您可以使用模板尝试:

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编程你正在做的事情,而宏是很自然的。